.Net WebAPI 跨域遇到的問題,及一些網上嘗試的解決方案!

一:WebAPI跨域遇到的問題

最近在研究vue+webapi實現前後端分離,在前後端數據交互的時候真的是被跨域的問題搞得我人都要炸了,第一是限制多個域名跨域請求的問題,二是options預請求的問題,三是我使用了owin驗證,阻止了跨域,唉,只能怪自己對webapi不熟悉,記錄一下避免下次在犯錯!
下面列舉一下常見的跨域設置方式:

二:常見的跨域設置方式

1:直接在webconfig節點中設置

在Web.config中system.webServer節點下面增加節點:

 <httpProtocol>
    <customHeaders>
      <add name="Access-Control-Allow-Origin" value="*" />
      <add name="Access-Control-Allow-Headers" value="Content-Type" />
      <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
    </customHeaders>
  </httpProtocol>
    <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>

httpProtocol節點裏面增加的是關於跨域的限制,Access-Control-Allow-Origin這個是允許通過跨域的網址,第二個是響應頭不用改,默認‘*’也行,第三個是允許通過跨域的方式,下面handlers節點網上的解釋是webapi默認是拒絕option請求的需要刪除掉OPTIONSVerbHandler,這些都是網上百度的,有些人這樣配置了之後就可以了,但我很悲催這樣配置之後不行!
下面是第二種解決方式:

2:使用Microsoft.AspNet.WebApi.Cors進行跨域

在項目中用NuGet安裝microsoft.aspnet.webapi.cors(支持多個域名跨域)
microsoft.aspnet.webapi.cors多個域名跨域
然後打開App_Start文件夾下面的WebApiConfig.cs文件夾配置跨域
WebApiConfig.cs文件夾配置跨域
代碼:

  var allowOrigins = ConfigurationManager.AppSettings["cors_allowOrigins"];
            var allowHeaders = ConfigurationManager.AppSettings["cors_allowHeaders"];
            var allowMethods = ConfigurationManager.AppSettings["cors_allowMethods"];
            var globalCors = new System.Web.Http.Cors.EnableCorsAttribute(allowOrigins,allowHeaders, allowMethods)
            {
                SupportsCredentials = true
            };

在appSettings節點中增加配置:
appSettings節點中增加配置

  <appSettings>
    <add key="cors_allowOrigins" value="http://localhost:8080/,http://novel.xpzzs.top/" />
    <add key="cors_allowHeaders" value="*" />
    <add key="cors_allowMethods" value="*" />
  </appSettings>

一般這樣配完就已經成功了,但也有options預請求失敗的情況,如果出現這種情況可以直接吧option請求攔截,讓它直接返回成功,看看能不能實現跨域!
添加一個類繼承HttpModule:

  public class SpecialMethodModule : IHttpModule
    {
        public SpecialMethodModule() { }
        public void Init(HttpApplication app)
        {
            app.BeginRequest += new EventHandler(this.BeginRequest);
        }
        public void Dispose() { }
        public void BeginRequest(object resource, EventArgs e)
        {
            HttpApplication app = resource as HttpApplication;
            HttpContext context = app.Context;
            if (context.Request.HttpMethod.ToUpper() == "OPTIONS")
            {
                context.Response.StatusCode = 200;
                context.Response.End();
            }
        }
    }

三:OWin本身跨域問題

如果上面操作做完都還不行,那麼你可以看下引用中是否有添加owin的引用,如果是有OWin,那麼極大可能是因爲owin的問題,到Startup.cs中找到Configuration方法,在這個方面中添加:

 app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

好了,到這裏我終於能夠成功的跨域請求了,真心不容易啊!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章