WEBAPI利用System.Web.Http.Cors開啟OPTION,以達到符合先導請求(Preflighted requests)設定自定義Header

摘要:WEBAPI利用System.Web.Http.Cors開啟OPTION,以達到跨網域設定自定義Header

其實本篇只是小弟日前所遇到的小問題.

在此做個記事.

寫的不好或是有誤的地方也請各位前輩多多指導

 

由於目前小弟的開發環境中,

需要與WEB API 做介接,

所以都會碰到跨網域請求的需求,

例如api.xxxx.com,api2.xxxx.com

但就單以純粹傳送資料至API來說,

SERVER端的API只需要
Access-Control-Allow-Origin

設定指定的網域也或者*號全部接受

如下圖

這樣Client端就能透過Simple requests(簡易請求)取回資料,

 

但問題來了,如果說我需要使用客製化的header呢?

當然小弟較為笨拙認為照原樣送就好了!

如下圖

結果就是冏了!!

如下圖

出現了405 OPTION Method Not Allowed

當然翻了一下解決方式!

其實很簡單只需要透過System.Web.Http.Cors在允許的動詞指令(methods)中加上OPTION就可以正常了

 

如下圖

至於更詳細的使用方式請參考

http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

不過還是有一點點小小疑問,

為什麼在送客製化header的時候,

會自動送出OPTION的請求?

參考了一下mozilla MDN  HTTP access control (CORS) 這篇文章中

晃然大悟,也就是在此做個分享

跟上述一開始所說的Simple requests(簡易請求),

在未送任何自定義的header,會自動採取(簡易請求),

但如果是跨網域中你需要傳送自定義的heade那麼就會採用Preflighted requests(預檢/先導請求)

由於跨站請求可能會攜帶使用者資料,所以必須先進行像Server端提出請求先導請求

這時候就會透過XHR第一次送出你想要自定義的header像Server端提出請求(WEB API),

就是採用OPTION

如果成功在Response Header中就會回覆允許自定義的header格式

Access-Control-Allow-Headers: test-a,test-b

如下圖

接下來第二次的請求才是真正的將值接收回來,並確定將自定義的header送出

如下圖

 

 

在此處放上範例程式碼:請點我

參考連結

Remote Debugging Devices

Enabling Cross-Origin Requests in ASP.NET Web API 2