CORS预检请求持续失败求助(React+ASP.NET 4.7.2)
CORS预检请求失败排查方案
核心问题分析与解决步骤
1. .NET Framework 4.7.2对通配符*的兼容性限制
ASP.NET Framework 4.7.2中,当请求包含自定义头部(如UserId、FE_URL)或Authorization这类凭证头部时,Access-Control-Allow-Headers: *不会生效,必须显式列出所有自定义请求头。同时带凭证的请求不能用*作为Access-Control-Allow-Origin,需指定具体前端域名。
修改Web.config配置:
<httpProtocol> <customHeaders> <add name="Access-Control-Allow-Headers" value="Content-Type, UserId, FE_URL, Authorization" /> <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" /> <add name="Access-Control-Allow-Origin" value="http://你的前端IIS域名:端口" /> <add name="Access-Control-Allow-Credentials" value="true" /> </customHeaders> </httpProtocol>
2. IIS未正确处理OPTIONS预检请求
本地IIS可能直接拦截OPTIONS请求,未转发至Web API,导致预检失败。
在Web.config中添加OPTIONS请求处理映射:
<system.webServer> <handlers> <remove name="OPTIONSVerbHandler" /> <add name="OPTIONSVerbHandler" path="*" verb="OPTIONS" modules="ProtocolSupportModule" resourceType="Unspecified" requireAccess="None" /> </handlers> </system.webServer>
若安装了IIS自带的CORS模块,建议暂时禁用,避免与ASP.NET配置冲突。
3. Axios凭证请求配置缺失
你的请求包含Authorization头部,属于带凭证请求,需在Axios实例中开启withCredentials:
const axiosInstance = axios.create({ withCredentials: true, headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'UserId': `${UserId}`, 'FE_URL': `${CurrentURL}`, 'Authorization': `Basic ${ACCESS_TOKEN}`, } })
4. 后端授权拦截器拦截OPTIONS请求
若后端有授权过滤器,需跳过OPTIONS请求的授权校验:
public override void OnAuthorization(HttpActionContext actionContext) { if (actionContext.Request.Method == HttpMethod.Options) { actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK); return; } // 原有授权逻辑 }
5. 排查具体错误信息
打开浏览器开发者工具Network面板,查看OPTIONS请求的响应:
- 404状态:检查IIS的请求映射是否正确转发OPTIONS到Web API
- 403状态:确认是否有授权逻辑拦截了OPTIONS请求
内容的提问来源于stack exchange,提问作者Nayeer Mahiuddin
相关产品推荐
相关产品推荐

