WebAPI跨域處理 WebApi2跨域問題 C#進階系列——WebApi 跨域問題解決方案:CORS

原文來自:http://www.cnblogs.com/heifengwll/p/6243374.html

WebApi2跨域問題

 

1、跨域問題產生的緣由:同源策略(Same origin policy)是一種約定,它是瀏覽器最核心也最基本的安全功能。html

如今全部支持JavaScript 的瀏覽器都會使用這個策略。
所謂同源是指,域名,協議,端口相同。
當一個瀏覽器的兩個tab頁中分別打開來 百度和谷歌的頁面
當瀏覽器的百度tab頁執行一個腳本的時候會檢查這個腳本是屬於哪一個頁面的,
即檢查是否同源,只有和百度同源的腳本纔會被執行。
因爲同源策略的限制,JavaScript就產生了跨域的問題。
參考: 同源策略
 
2、在WebApi2中的解決方法。
環境:vs2013,entity framework 6.0
後端項目:webApi 2
前端項目:
提交ajax時候用的類型:application/json
一、在nuget中搜索cors,安裝

二、在文件WebApiConfig.cs中配置跨域設置web

三、由於前端提交ajax請求,用的類型是application/json。發送post請求前會先發送一個預請求,就是option請求。ajax

要在Web.config中配置下處理option請求,讓後端可以正確的響應option請求,前端纔會繼續發送post請求。json

這兩個處理程序會影響option請求的正確處理。後端

<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>跨域

 

 

一、默認的配置:瀏覽器

var cors = new EnableCorsAttribute("*", "*", "*");安全

            config.EnableCors(cors);服務器

這樣設置能夠實現簡單請求的跨域,

可是非簡單請求是那種對服務器有特殊要求的請求,好比請求方法是PUT或DELETE,或者Content-Type字段的類型是application/json。非簡單請求的CORS請求,會在正式通訊以前,增長一次HTTP查詢請求,稱爲"預檢"請求(preflight)。options請求。

觸發options請求的條件:

一、非GET 、POST請求

  二、POST請求的content-type不是常規的三個:application/x- www-form-urlencoded(使用 HTTP 的 POST 方法提交的表單)、multipart/form-data(同上,但主要用於表單提交時伴隨文件上傳的場合)、text/plain(純文本)

  三、POST請求的payload爲text/html

  四、設置自定義頭部

 

可是不能實現非簡單請求的跨域。

還須要在web.config中<system.webServer>下添加

<handlers>

      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />

      <remove name="OPTIONSVerbHandler" />

          <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

</handlers>

 

 

注意 :

var cors = new EnableCorsAttribute("10.116.56.69:90", "*", "*");

是不行的 ,要寫http://10.116.56.69:90

注意:若是寫http://localhost:90  ,那瀏覽器訪問的時候也要訪問 http://localhost:90,若是訪問http://10.116.56.69:90,也是不能跨域的。

原文來自:http://www.cnblogs.com/heifengwll/p/6243374.html

 

本人遇到的坑:

坑一:  託管模式 設置爲了 經典模式 此時是沒法生效工做的    調成集成模式下就行了 (應該是經典模式下 web.config有差異的緣由)

坑二:在Global的Application_Start中必須先註冊 API路由 再註冊 MVC路由  順序不能顛倒 ,不然不生效

protected void Application_Start()
{

// 必須先註冊WebAPI路由 再註冊MVC路由 不然 WebAPICors 不生效 GlobalConfiguration.Configure(WebApiConfig.Register); RouteConfig.RegisterRoutes(RouteTable.Routes); }

相關文章
相關標籤/搜索