在 Azure 上为 .NET Web Api 启用 CORS

Posted

技术标签:

【中文标题】在 Azure 上为 .NET Web Api 启用 CORS【英文标题】:Enabling CORS for .NET Web Api on Azure 【发布时间】:2015-10-16 05:55:39 【问题描述】:

我将我的 web 和 api 项目都部署到了单独的 Azure webapps 中,并且正在努力解决 CORS 问题。在本地部署时一切正常,但一旦发布到 Azure 就不行了。

我正在使用两种不同的方法来启用 CORS,但似乎都无法解决我的问题。

可能的修复:

    在我的 web.config 中,我为 <add name="Access-Control-Allow-Origin" value="*" /> 添加了一个 customHeader 在 WebApiConfig.cs 的 Register 方法中,我将 enableCors 称为 var cors = new EnableCorsAttribute("*", "*", "*"); config.EnableCors(cors);

参考上述两个修复的方案如下:

在没有使用 #1 或 #2 的情况下,每个服务器调用都会返回 no access-control-allow-origin 错误(预期) 同时使用 #1 和 #2 时,我收到一个错误,提示我使用相同的值启用了两次 CORS(预期) 如果我只使用 #1,我不会收到 CORS 错误,但每个 API 方法都会返回 405 not allowed 错误 如果我只使用 #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 路线。确保 config.EnableCors(cors);是您在启动时调用的第一件事。这似乎对我有帮助。 @AndresCastro 感谢您的回复。在我的 Register 函数中,只有 #2 作为字面上的前两个语句,我在每个 API 调用上都收到 no access-control-allow-origin 错误:( 介意发布您的应用启动和注册代码吗? @AndresCastro 绝对是,刚刚编辑到我的原始帖子中 【参考方案1】:

我认为这是 IIS 默认选项处理程序的常见问题。您必须更新您的 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>

【讨论】:

谢谢你,但不幸的是这并没有解决问题,我仍然收到同样的无访问控制错误 @SteveSchmitt 我不知道,也许我在 3 年前有一个原因忘了评论?我不接受 那不好 :d【参考方案2】:

我发现将 Allow 标头添加到 web.config 是让事情为我工作的最简单方法。请注意,您不能同时使用这两种方法,您必须选择其中一种。

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

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

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

【讨论】:

以上是关于在 Azure 上为 .NET Web Api 启用 CORS的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET HttpContext 在 Azure 上为空

在 Azure 应用服务上为 Flask Web 应用安装 unixodbc-dev

无法在 Azure Web App 上为来自 DockerHub 的容器部署 Windows 容器

.NET Core Web API 在部署到 Azure 后无法正常工作

在 Azure Linux Web App 上为 reactjs 应用安装 node_modules 的最佳实践

Azure APIM URL 引发 System.Net.WebException - SSL/TLS 如何在 azure web api 和 azure APIM 中发挥作用?