在Azure上启用.NET Web Api的CORS

时间:2015-07-25 18:02:07

标签: azure asp.net-web-api cors

我已经部署了我的web和api项目来分离Azure webapps并且正在努力解决CORS问题。在本地部署时,一切正常,但不会发布到Azure。

我使用两种不同的方法来启用CORS,似乎都没有解决我的问题。

潜在修复:

  1. 在我的web.config中,我为<add name="Access-Control-Allow-Origin" value="*" />
  2. 添加了customHeader
  3. 在WebApiConfig.cs的Register方法中,我将enableCors称为var cors = new EnableCorsAttribute("*", "*", "*"); config.EnableCors(cors);
  4. 引用上述两个修复的方案如下:

    • 如果没有使用#1或#2,则每次服务器调用都会返回no access-control-allow-origin错误(预期)
    • 使用#1和#2时,我收到一个错误,即我使用相同的值启用CORS两次(预期)
    • 如果我只使用#1,我就不会收到CORS错误,但每个API方法都会返回405不允许的错误
    • 如果我只使用#2,则每个api调用都会返回no access-control-allow-origin错误

    问题:如何为Azure中托管的.NET Web Api项目全局启用CORS?

    appstart并注册代码:

        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
    
        public static void Register(HttpConfiguration config)
        {
            // Enable CORS
            // TODO, * below is debug only
            var cors = new EnableCorsAttribute("*", "*", "*");
            config.EnableCors(cors);
    
            // Web API configuration and services
            // Configure Web API to use only bearer token authentication.
            config.SuppressDefaultHostAuthentication();
            config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
    
            // Web API routes
            config.MapHttpAttributeRoutes();
    
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    

2 个答案:

答案 0 :(得分:0)

我认为这是IIS默认optionshandler的常见问题。您必须更新Web.Config以禁用默认处理程序。这就是我用于Azure上托管的ASP.Net vnext的内容。

<system.webServer>
    <modules>
      <remove name="WebDAVModule" />
    </modules>
    <handlers>
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="WebDav" />
      <remove name="OPTIONSVerbHandler" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>

答案 1 :(得分:0)

我发现将允许标头添加到web.config是让事情适合我的最简单方法。请注意,您不能同时使用这两种方法。

我相信你的405 Not Allowed错误的解决方案是你还需要在web.config中包含这样的一行:

   <add name="Access-Control-Allow-Headers" value="Authorization, Origin, Content-Type "/>

如果您仍然收到该错误,则可能需要在此列表中包含其他值:

&lt; add name =&#34; Access-Control-Allow-Headers&#34;值=&#34;访问控制允许标题,授权,来源,接受,X请求,内容类型,访问控制请求方法,访问控制请求标题&#34; /&GT;