您好,登錄后才能下訂單哦!
本篇內容介紹了“怎么解決ASP.NET開發web應用遇到的javascript跨域請求問題”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
解決方案
不提倡跨域的post請求。
0.jquery中ajax的跨域方案jsonp
.ashx代碼
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace KB.DSN.Web.API.Tokens { /// <summary> /// Summary description for Get /// </summary> public class Get : IHttpHandler { public void Proce***equest(HttpContext context) { setresponsecontext(context); var token = KB.DSN.BusinessAccess.UniqueCommunicationCode.GenerateUniqueCommunicationCode(); var outputobject = new { Head = new Models.KBJsonHeadResponse(), Body = new { Token = token } }; var outputjsonstring = Newtonsoft.Json.JsonConvert.SerializeObject(outputobject); context.Response.Write(context.Request.QueryString["callback"]+"("+outputjsonstring+")"); } private void setresponsecontext(HttpContext context) { context.Response.ContentEncoding = System.Text.Encoding.UTF8; context.Response.ContentType = "application/json"; } public bool IsReusable { get { return false; } } } }
html頁面
function getToken_jsonp(){ $.ajax({ url: "http://192.168.0.111/api/tokens/get.ashx", type: "get", dataType: "jsonp", jsonp: "callback", async: false, contentType: "application/json", success: function(data){ //alert("getToken success"); $("#token").text($.toJSON(data)); //console.log(data); }, error:function(){ alert("getToken fail"); } }); }
jsonp只支持GET請求,不支持POST請求,就算你寫了POST,它會自動轉換為GET請求,把你的data放在querystring中。
1.修改web.config文件
整個應用都支持跨域的請求。
web.config
<system.webServer> <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Methods" value="OPTIONS,POST,GET"/> <add name="Access-Control-Allow-Headers" value="x-requested-with"/> <add name="Access-Control-Allow-Origin" value="*" /> </customHeaders> </httpProtocol> </system.webServer>
html page
function addContact() { var contact = new Object(); contact.FirstName = $("#firstName").attr("value"); contact.LastName = $("#lastName").attr("value"); contact.PhoneNo = $("#phoneNo").attr("value"); contact.EmailAddress = $("#emailAddress").attr("value"); $.ajax({ url: "http://localhost:10401/api/contacts/AddContact.ashx", type: "POST", dataType: "json", data: $.toJSON(contact), success: function () { loadAllContacts(); } }); }
這種方式不能設置contentType: "application/json",否則會提示"Request header field Content-Type is not allowed by Access-Control-Allow-Headers."去掉ajax中的contentType設置就可以了! 想要設置contentType也可以,需要將web.config文件中的<add name="Access-Control-Allow-Headers" value="x-requested-with"/> 修改為<add name="Access-Control-Allow-Headers" value="x-requested-with,content-type"/>
在II6中web.config不支持system.webServer配置節,所以需要在IIS中設置httprequestheader。將web.config文件中的自定義頭加入IIS的設置中。 |
FindContact.ashx
/// <summary>
/// Summary description for FindContact
/// </summary>
public class FindContact : IHttpHandler
{
public void Proce***equest(HttpContext context)
{
context.Response.ContentEncoding = Encoding.UTF8;
context.Response.ContentType = "application/json";
var stream = context.Request.InputStream;
var reader = new StreamReader(stream);
var input=reader.ReadToEnd();
var o = Newtonsoft.Json.JsonConvert.DeserializeObject<Models.Contact>(input);
var list = new List<Models.Contact>();
list.Add(o);
list.Add(o);
context.Response.Write(Newtonsoft.Json.JsonConvert .SerializeObject ( list ));
}
public bool IsReusable
{
get
{
return false;
}
}
}
2.在請求中設置HttpHeader
針對單個請求。
FindContact.ashx
/// <summary> /// Summary description for FindContact /// </summary> public class FindContact : IHttpHandler { public void Proce***equest(HttpContext context) { context.Response.ContentEncoding = Encoding.UTF8; context.Response.ContentType = "application/json"; var stream = context.Request.InputStream; var reader = new StreamReader(stream); var input=reader.ReadToEnd(); var o = Newtonsoft.Json.JsonConvert.DeserializeObject<Models.Contact>(input); var list = new List<Models.Contact>(); list.Add(o); list.Add(o); #region 支持跨域請求 context.Response.ClearHeaders(); string origin = context.Request.Headers["Origin"]; context.Response.AppendHeader("Access-Control-Allow-Origin", string.IsNullOrEmpty(origin) ? "*" : origin); string requestHeaders = context.Request.Headers["Access-Control-Request-Headers"]; context.Response.AppendHeader("Access-Control-Allow-Headers", string.IsNullOrEmpty(requestHeaders) ? "*" : requestHeaders); context.Response.AppendHeader("Access-Control-Allow-Methods", "POST, OPTIONS"); #endregion context.Response.Write(Newtonsoft.Json.JsonConvert .SerializeObject ( list )); } public bool IsReusable { get { return false; } } }html page
function addContact() { var contact = new Object(); contact.FirstName = $("#firstName").attr("value"); contact.LastName = $("#lastName").attr("value"); contact.PhoneNo = $("#phoneNo").attr("value"); contact.EmailAddress = $("#emailAddress").attr("value"); $.ajax({ url: "http://localhost:10401/api/contacts/AddContact.ashx", type: "POST", dataType: "json", data: $.toJSON(contact), success: function () { loadAllContacts(); } }); }3.使用代理
假設你有兩個web應用:一個應用放html頁面,給用戶提供界面;一個應用放服務,使用.ASHX處理請求。
你在html應用中使用ajax請求ashx應用的接口,就是ajax跨域請求。
你可以在html應用中寫一些后臺代碼,在代碼中向ashx應用提交數據。
然后你的html應用的頁面中將收集到的數據發送到html應用的后臺代碼中,由后臺代碼發送數據到ashx應用,這就不是ajax跨域請求了。
在html應用中的后臺代碼就被叫做“代理”,代理html應用到ashx應用的請求。
“怎么解決ASP.NET開發web應用遇到的javascript跨域請求問題”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。