已配置EnableCorsAttribute但不生效?Web API 2跨域问题求助
我碰到过好几个开发者遇到和你一模一样的问题——明明在WebApiConfig里加了CORS配置,但Angular那边还是报预检请求的错误。通常这几个点是最容易出问题的,你可以逐一排查:
检查WebApiConfig的代码顺序
Web API的配置注册顺序非常关键,EnableCors必须在路由注册之前执行,否则CORS头不会被正确添加到响应里。你可以把代码调整成这样:public static class WebApiConfig { public static void Register(HttpConfiguration config) { // 先启用CORS,这一步必须放在路由注册前面! var cors = new EnableCorsAttribute("*", "*", "*"); config.EnableCors(cors); // 再注册Web API路由 config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } }排查是否有自定义过滤器覆盖了响应头
如果你的项目里有自定义的ActionFilterAttribute或者ExceptionFilterAttribute,有些可能会在处理响应时修改或清除头信息,把Access-Control-Allow-Origin给去掉了。你可以暂时禁用这些自定义过滤器,测试一下是否还会报错。检查web.config或IIS的CORS冲突配置
有时候IIS的CORS模块或者web.config里的自定义HTTP头配置会和Web API的EnableCors冲突。你可以检查web.config里有没有类似下面的配置,如果有,先注释掉试试:<httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="*" /> </customHeaders> </httpProtocol>给控制器/Action单独添加CORS特性
全局配置有时候会被局部配置覆盖,或者某些控制器的特殊设置导致全局CORS不生效。你可以直接在对应的控制器或Action上添加[EnableCors]特性,强制启用CORS:[EnableCors(origins: "*", headers: "*", methods: "*")] public class UsersController : ApiController { [HttpGet] public IHttpActionResult Search() { // 你的业务逻辑代码 } }确保OPTIONS预检请求能被正确处理
预检请求(OPTIONS)是不带身份凭证的,如果你的API启用了身份验证(比如Windows身份验证),IIS可能会拒绝OPTIONS请求。这时候需要在web.config里允许OPTIONS请求匿名访问:<system.web> <authorization> <allow verbs="OPTIONS" users="*"/> <deny users="?"/> </authorization> </system.web>
一般来说,调整注册顺序就能解决大部分这类问题,如果还不行,再逐一排查后面的点。
内容的提问来源于stack exchange,提问作者user9393635

