日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

$.ajax 跨域请求 Web Api

發布時間:2024/9/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 $.ajax 跨域请求 Web Api 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

WepApi確實方便好用,沒有配置文件,一個apicontroller直接可以干活了。但今天用$.ajax跨域請求的時候總是獲取不到數據,用fiddler一看確實抓到了數據,但回到$.ajax函數中,直接觸發了error,沒有觸發success,即使狀態碼是200。用apiclient或者瀏覽器直接訪問都是ok的。搜羅一番。最終在這篇文章上面找到答案 。http://code.msdn.microsoft.com/windowsdesktop/Implementing-CORS-support-a677ab5d

原因

? ? ?在默認情況下,為防止CSRF跨站偽造攻擊,一個網頁從另外一個域的網頁獲取數據的時候就會受到限制。有一些方法可以突破這個限制,JSONP就是其一。它使用<script> 標簽加一個回調函數。但JSONP 只支持Get方法。而CORS(Cross-Origin Resource Sharing) 跨域資源共享,是一種新的header規范,可以讓服務器端放松跨域的限制,可以根據header來切換限制或不限制跨域請求。它支持所有的Http請求方式。跨域的資源請求帶有一個Http header:Origin,如果服務器支持CORS,響應就會帶有一個header:Access-Control-Allow-Origin ,也有一些特殊的請求。采用?HTTP “OPTIONS” 的方式,hearder中帶有Access-Control-Request-Method或Access-Control-Request-Headers,服務器響應的hearder中需要帶有Access-Control-Allow-Methods,Access-Control-Allow-Headers才行。

實現?

? ? 那怎么實現CORS呢,這用到了Message Handler。它可以在管道中攔截并修改Request,代碼如下:

public class CorsHandler : DelegatingHandler{const string Origin = "Origin";const string AccessControlRequestMethod = "Access-Control-Request-Method";const string AccessControlRequestHeaders = "Access-Control-Request-Headers";const string AccessControlAllowOrigin = "Access-Control-Allow-Origin";const string AccessControlAllowMethods = "Access-Control-Allow-Methods";const string AccessControlAllowHeaders = "Access-Control-Allow-Headers";protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken){bool isCorsRequest = request.Headers.Contains(Origin);bool isPreflightRequest = request.Method == HttpMethod.Options;if (isCorsRequest){if (isPreflightRequest){return Task.Factory.StartNew<HttpResponseMessage>(() =>{HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);response.Headers.Add(AccessControlAllowOrigin, request.Headers.GetValues(Origin).First());string accessControlRequestMethod = request.Headers.GetValues(AccessControlRequestMethod).FirstOrDefault();if (accessControlRequestMethod != null){response.Headers.Add(AccessControlAllowMethods, accessControlRequestMethod);}string requestedHeaders = string.Join(", ", request.Headers.GetValues(AccessControlRequestHeaders));if (!string.IsNullOrEmpty(requestedHeaders)){response.Headers.Add(AccessControlAllowHeaders, requestedHeaders);}return response;}, cancellationToken);}else{return base.SendAsync(request, cancellationToken).ContinueWith<HttpResponseMessage>(t =>{HttpResponseMessage resp = t.Result;resp.Headers.Add(AccessControlAllowOrigin, request.Headers.GetValues(Origin).First());return resp;});}}else{return base.SendAsync(request, cancellationToken);}}}

然后在Global中加入:

protected void Application_Start(object sender, EventArgs e){GlobalConfiguration.Configuration.MessageHandlers.Add(new CorsHandler());WebApiConfig.Register(GlobalConfiguration.Configuration);}

腳本:

$.ajax({// url: "http://localhost:11576/api/Values",url: "http://localhost:39959/api/user/login?name=niqiu&pwd=123456",type: "GET",//contentType: "application/json;",success: function(result) {alert(result.status);},error: function (XMLHttpRequest, textStatus, errorThrown) {alert("出錯!XMLHttpRequest:" + XMLHttpRequest.status);}});

?這樣訪問就ok了。

總結

以上是生活随笔為你收集整理的$.ajax 跨域请求 Web Api的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。