关于前端Jquery的Ajax跨域请求接口时自定义Header,C#后台获取的问题

版权声明:未经本人允许,必须声明原文转载地址和作者! https://blog.csdn.net/liuchang19950703/article/details/87797007

1.首先弄清楚Ajax跨域请求接口时,Http会发送2次请求:

第1次请求是【OPTIONS】预请求,属于简单请求:用以检查请求是否是可靠安全的,如果options获得的回应是拒绝性质的,比如404\403\500等http状态,就会停止post、put等请求的发出,还可以添加【WEB客户端前端自定义的Header参数】允许通过。

第2次请求是【POST】请求,属于复杂请求:用以请求接口,在此还可以验证【WEB客户端前端自定义的Header参数】和【请求接口的网址】是否合法,通过后才是真正进入了接口的方法体内。

2.自定义添加Header代码:

前端:

 $.ajax({
            type: "Post",
            url: "http://XXX.com/EquipmentApi.aspx/" + obj.method,
            data: JSON.stringify(obj.data),
            //跨域请求
            xhrFields: { withCredentials: true },
            //跨域请求
            crossDomain: true,
            beforeSend: function (hr) {
                //自定义的Header,后台Cors文件要添加配置才可以读取
                hr.setRequestHeader("appKey", "123456");
            },
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (data) {
                if (obj.btn)
                    obj.btn.removeAttr("disabled");
                obj.success(data)
            },
            error: function (err) {
                console.log(err.responseText);
                if (obj.btn)
                    obj.btn.removeAttr("disabled");
                if (obj.error != undefined)
                    obj.error(err)
            }
        });

后台:

 /// <summary>
    /// Cors 的摘要说明
    /// </summary>
    public class Cors : IHttpModule
    {
        string[] origins = new string[] {
            "http://aaa.com",
            "http://bbb.com"
        };
        public Cors() { }

        public void Dispose() { }

        public void Init(HttpApplication context)
        {
            context.BeginRequest += Context_BeginRequest;
            context.Error += Context_Error;
        }

        private void Context_Error(object sender, EventArgs e)
        {
            ZhClass.ZH.SaveErr("Error:" + HttpContext.Current.Server.GetLastError().toString());
        }

        private void Context_BeginRequest(object sender, EventArgs e)
        {  
            //第一次请求(options请求)
            //Save();
            string origin = HttpContext.Current.Request.Headers["Origin"];
            if (HttpContext.Current.Request.HttpMethod == "OPTIONS") //如是options,则一概放行
            {
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", origin);
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS,DELETE");
                //这里的【appKey】是自定义的Header,必须在第一次【OPTIONS】允许通过,才能在第二次【POST】获取到值。
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "appKey,content-type");
                HttpContext.Current.Response.End(); //这个必须有,否则客户端不会发送POST请求
            }
            //第二次请求(POST请求,这个请求通过才能真正到达接口的方法)
            //Save();
            string appKey= HttpContext.Current.Request.Headers["appKey"];
            if (origins.Contains(origin) || appKey== "123456")
            {
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", origin.IsNull("*"));
            }
        }

        void Save()
        {
            List<string> list = new List<string>();
            list.Add(HttpContext.Current.Request.HttpMethod);
            foreach (var p in HttpContext.Current.Request.Headers)
            {
                list.Add(string.Format("{0}:{1}", p, HttpContext.Current.Request.Headers[p.ToString()]));
            }
            ZhClass.ZH.SaveErr(string.Join("\r\n", list));
        }
    }

猜你喜欢

转载自blog.csdn.net/liuchang19950703/article/details/87797007