安装Microsoft.AspNet.Cors并配置后Web Api仍出现CORS错误如何解决
CORS报错问题原因分析
- 前端页面直接以本地文件方式打开(
file://协议访问),浏览器会将请求源标识为null,你配置的允许源列表里没有匹配null的规则,就算配置*通配,部分.NET Framework版本的CORS中间件对null源的处理存在兼容问题,不会正常返回Access-Control-Allow-Origin头 - WebApiConfig.cs的CORS注册顺序错误,必须要把
config.EnableCors()写在路由注册等其他配置之前,如果你把它放在路由注册后面,CORS中间件不会处理预检OPTIONS请求,自然不会返回对应的跨域头 - 控制器/接口方法标记了
[HttpPost]等特性,但没有单独处理OPTIONS请求,IIS默认拦截了OPTIONS请求,没有交给Web API处理,导致预检请求直接返回没有跨域头的响应 - 项目web.config里有自定义的headers配置,或者存在请求过滤规则,覆盖了CORS中间件输出的跨域头,甚至直接删除了对应头
解决方案
- 前端运行方式修正:不要直接打开本地HTML文件,将前端代码部署到本地web服务器(比如IIS Express、Nginx、VS Code的Live Server插件)上运行,保证请求源是正常的
http://localhost:xxxx格式,和你配置的允许源匹配 - 修正CORS注册顺序:打开WebApiConfig.cs,确认
config.EnableCors()是所有配置的第一行,示例配置如下:
public static class WebApiConfig { public static void Register(HttpConfiguration config) { // 第一行就启用CORS config.EnableCors(); // 之后再写路由等其他配置 config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } }
- 允许OPTIONS请求处理:在web.config的
<system.webServer>节点下添加如下配置,放行OPTIONS请求交给Web API处理,同时注意不要在customHeaders节点手动添加跨域头,避免和CORS中间件冲突:
<system.webServer> <handlers> <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> </handlers> <modules runAllManagedModulesForAllRequests="true"> <remove name="WebDAVModule"/> </modules> </system.webServer>
- 如果确实需要支持本地file协议打开的页面请求,可以在
EnableCors特性里明确允许null源:
[EnableCors(origins: "https://localhost:44397,null", headers: "*", methods: "*", exposedHeaders: "X-My-Header")]
内容的提问来源于stack exchange,提问作者ShatterStar
相关产品推荐
相关产品推荐

