在 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 中发挥作用?