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