媒介
近来公司项目举行架构调解,由本来的三层架构革新升级到微效劳架构(正确的说是效劳化,还没完整做到微的水平,颗粒度没那末细),遵照RESTFull范例,使前后端完整星散,完成大前端头脑。由因而首次尝试,半途也遇到了不少题目。本日就来讨论一下其中之一的题目,WebAPI与前端Ajax 举行跨域数据交互时,因为都在差别的二级域名下(一级域名雷同),致使Cookies数据没法猎取。
最最先经由历程头部(Header)将Cookies传输到其WebAPI,也能处置惩罚题目。
下面报告别的一种处置惩罚方案。
处置惩罚历程:
步骤一:将Cookies的Domain(域)设置成一级域名,比方:“.wbl.com”(a.wbl.com域名下)
这是条件,此时在其中一个WebAPI中设置了Cookies后,用浏览器直接接见别的的WebAPI是能够猎取到Cookies的。比方:a.wbl.com域名下设置的Cookies,用浏览器直接接见b.wbl.com域名的WebAPI是能够猎取到Cookies的。然则用c.web.com域名下的Ajax接见b.wbl.com时,就没法猎取到Cookies了,这是因为浏览器中Ajax的权限相对较低,Ajax没法跨域题目致使。
写入Cookies代码:
/// <summary> /// 给指定的 Cookies 赋值 /// </summary> /// <param name="cookKey">Cookies 称号</param> /// <param name="value">Cookies 值</param> /// <param name="domain">设置与此 Cookies 关联的域(如:“.tpy100.com”)(能够使该域名下的二级域名接见)</param> public static void SetCookiesValue(string cookKey, string value, string domain) { HttpCookie cookie = new HttpCookie(cookKey); cookie.Value = value; cookie.HttpOnly = true; if (!string.IsNullOrEmpty(domain) && domain.Length > 0) cookie.Domain = domain; HttpContext.Current.Response.Cookies.Add(cookie); }
步骤二:JQuery中Ajax运用Jsonp数据范例处置惩罚跨域题目(c.wbl.com域名下)
前后端须要定义一致的回调(Callback)函数名。
前端Ajax代码:
// 设置Cookies function set() { var url = "http://a.wbl.com/api/setvalue/888888"; $.ajax({ type: "get", url: url, dataType: "jsonp", jsonp: "callbackparam", //效劳端用于吸收callback挪用的function名的参数 jsonpCallback: "success_jsonpCallback", //callback的function称号 success: function (json) { console.log(json); alert(json); }, error: function () { alert('fail'); } }); } // 猎取Cookies function get() { var url = "http://b.wbl.com/api/getvalue"; $.ajax({ type: "get", url: url, dataType: "jsonp", jsonp: "callbackparam", //效劳端用于吸收callback挪用的function名的参数 jsonpCallback: "success_jsonpCallback", //callback的function称号 success: function (json) { console.log(json); alert(json); }, error: function () { alert('fail'); } }); }
步骤三:WebAPI中返回jsonp数据范例
Jsonp花样:
success_jsonpCallback({“Cookies”:”888888”})
因为这类花样与json花样有所差别,只用WebAPI里的返回IHttpActionResult或HttpRequestMessage范例不可,末了经由历程流的体式格局输出才完成了这个花样。
WebAPI代码:
[Route("api/GetValue")] [HttpGet] public void GetValue() { string ccc = MyTools.Request.GetString("callbackparam"); var a = new { name = "Cookies", value = MyTools.Cookies.GetCookiesValue("name") }; string result = ccc + "({\"Cookies\":\"" + MyTools.Cookies.GetCookiesValue("name") + "\"})"; //var response = Request.CreateResponse(HttpStatusCode.OK); //response.Content = new StringContent(result, Encoding.UTF8); HttpContext.Current.Response.Write(result); HttpContext.Current.Response.End(); // return response; } [Route("api/SetValue/{id}")] [HttpGet] public void SetValue(int id) { //string domain = ""; string domain = ".wbl.com"; MyTools.Cookies.ClearCookies("name", domain); MyTools.Cookies.SetCookiesValue("name", id.ToString(), domain); string ccc = MyTools.Request.GetString("callbackparam"); string result = ccc + "({\"result\":\"设置胜利\"})"; HttpContext.Current.Response.Write(result); HttpContext.Current.Response.End(); }
终究结果:
后言:
这只是处置惩罚这个题目的一种要领。百度后另有一种经由历程第三方插件(Cross-Origin、Help Page)来处置惩罚的,后续在举行试验。列位途经的大神若有更好的要领,望不要悭吝,请见教!菜鸟感激涕零!
以上就是ASP.Net中关于WebAPI与Ajax举行跨域数据交互时Cookies数据的通报的细致内容,更多请关注ki4网别的相干文章!