zoukankan      html  css  js  c++  java
  • JS通过服务代理调用跨域服务

    这里讲的是服务代理,应用情景如下:
     A站点有一个JS脚本需要调用B站点的服务接口,但是A站点和B站点不是同一个域名下,这样就关系到跨域访问的了问题了,一种解决方法是通过一个代理去接管所有对B站点服务的调用。
    服务器端:AcrossServer.ashx
    public class AcrossServer : IHttpHandler {
        
        
    public void ProcessRequest (HttpContext context) {
            context.Response.ContentType 
    = "text/plain";

            
    string clientKey = context.Request["ClientKey"];
            
    string clientIP = context.Request["ClientIP"];

            context.Response.Write(
    string.Format("AcrossServer:ClientKey={0}, ClientIP={1}", clientKey, clientIP));
        }

    }
    代理服务:
    public class AcrossClient : IHttpHandler {
        
        
    public void ProcessRequest (HttpContext context) {
            context.Response.ContentType 
    = "text/plain";

            
    //构造Post数据
            string clientKey = "af8b908b-7735-4db6-9d8f-eef05b2eef69";
            
    string clientIP = context.Request.UserHostAddress;
            StringBuilder sb 
    = new StringBuilder();
            sb.AppendFormat(
    "ClientKey={0}&ClientIP={1}", clientKey, clientIP);
            
    foreach (string key in context.Request.Form.AllKeys)
            {
                sb.AppendFormat(
    "&{0}={1}", key, context.Request.Form[key]);
            }
            
    string postData = sb.ToString();
            
    byte[] data = Encoding.UTF8.GetBytes(postData);

            
    //HttpWebRequest
            string url = string.Format("http://my2.csdn.net/Samples/CJB3/AcrossServer.ashx");
            HttpWebRequest request 
    = (HttpWebRequest)HttpWebRequest.Create(url);
            request.Method 
    = "POST";
            request.ContentType 
    = "application/x-www-form-urlencoded";
            request.ContentLength 
    = data.Length;
            request.Timeout 
    = 10000;//10s

            
    string content = string.Empty;
            
    try
            {
                
    //把postdata写入HttpWebRequest
                using (Stream requestStream = request.GetRequestStream())
                {
                    requestStream.Write(data, 
    0, data.Length);
                    requestStream.Close();
                }
                
    //获取HttpWebResponse
                using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                {
                    
    if (response.StatusCode == HttpStatusCode.OK)
                    {
                        
    using (Stream stream = response.GetResponseStream())
                        {
                            
    using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
                            {
                                content 
    = reader.ReadToEnd();
                                reader.Close();
                            }
                            stream.Close();
                        }
                    }
                    response.Close();
                }
            }
            
    catch (System.Net.WebException)
            {
                
    //TODO:考虑在此添加超时异常的日志
            }
            
    finally
            {
                
    if (request != null)
                {
                    request.Abort();
                    request 
    = null;
                }
            }
            
            context.Response.Write(
    string.Format("AcrossClient=>{0}", content));
        }

    }
    我们通过在代理端重新封装所有的Post数据并且添加新的服务验证等数据一起Post到真正的服务接口,最后把调用的返回也返回给代理调用方。

    当然,我们可以对Post操作进一步封装到一个方法
    PostRequest
  • 相关阅读:
    使用pipenv管理虚拟环境
    使用cookiecutter创建django项目
    Django中ModelViewSet的应用
    Redis添加历史浏览记录
    Django中配置用Redis做缓存和session
    点击即复制
    PostGreSQL数据库安装配置说明
    IntelliJ IDEA 2017.1.4 x64配置说明
    Struts2之2.5.10.1HelloWorld
    Apache Shiro系列(1)
  • 原文地址:https://www.cnblogs.com/chenjunbiao/p/1760164.html
Copyright © 2011-2022 走看看