WebApi中跨域解决办法
為什么80%的碼農都做不了架構師?>>> ??
在做Web開發中,常常會遇到跨域的問題,到目前為止,已經有非常多的跨域解決方案。由于時間有限,本文不會深入。
筆者遇到的問題是Js調用WebAPI中的數據進行跨域的場景。涉及若干跨域方案:
方案1:jsonp+回調
方案2:Microsoft.AspNet.WebApi.Cors提供的跨域屬性
方案3:利用ACAO編寫自定義Filter實現
一、關于方案一
方案1是同事提出來的,已經經過論證,并且自己研究過,是可行的。本質上是通過script標簽動態加載js,還有callback機制。
但是,我個人覺得這個方案有些不足:
實現細節復雜,技術復雜性增大了不少,并且不好理解(服務器端、Web前端兩頭忙活)
只支持單向跨域
只支持Get,不支持Post等Http請求
擴展性不強
我在讀參考文章時,感覺思路不清晰(至于是作者思路不清晰,還是寫作思路不清晰,還是我個人理解能力不到位這個不好說。)
二、關于方案二
首先,我提出了方案2。當時在我看來,這個是比較合適的一個方案,接近完美。但是,它不可行。
原因在于:Microsoft.AspNet.WebApi.Cors的framework版本是4.5,而我們現有項目是4.0。我們的時間有限,幾乎沒有時間做深入研究。
三、關于方案三
我受方案2的啟發,個人實現了方案3。方案3實現的最終效果接近方案2。支持:Global級別、Controller級別、Action級別。
代碼如下:
using System.Web.Http.Filters; namespace MvcApplication1.CustomFilter {public class CrossSiteAttribute : ActionFilterAttribute{private const string Origin = "Origin";private const string AccessControlAllowOrigin = "Access-Control-Allow-Origin";private const string originHeaderdefault = "*";public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext){actionExecutedContext.Response.Headers.Add(AccessControlAllowOrigin, originHeaderdefault);}} }服務器端代碼示例:
[CrossSite]public IEnumerable<string> Get(){return new string[] { "value1", "value2" };}服務器端只需要把過濾器的標簽[CrossSite]寫上,服務器端就支持跨域了。省去了Web前端的處理和服務器端回調的處理。
當然,它很容易進行擴展。
轉載于:https://my.oschina.net/wlb/blog/272639
總結
以上是生活随笔為你收集整理的WebApi中跨域解决办法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MyClass a,b[2],*p[2]
- 下一篇: 网页布局的一点感触