React调用部署在IIS的ASP.NET Core API的PUT接口出现CORS错误如何排查
问题根因说明
Postman调用接口正常是因为Postman不会触发浏览器的跨域预检规则,不会主动发送OPTIONS预检请求,只要PUT方法本身逻辑正常就能调用成功。而浏览器对于跨域的PUT、DELETE等带自定义请求头的非简单请求,会先发送OPTIONS预检请求确认服务端允许跨域,预检失败就会抛出CORS错误,请求根本不会到达后端的业务接口。
排查步骤(按优先级排序)
1. 修复IIS WebDAV模块拦截问题(90%概率是该原因)
IIS默认安装的WebDAV模块会主动拦截OPTIONS、PUT、DELETE这类HTTP谓词,直接拒绝预检请求导致跨域报错,在你站点的web.config文件中添加以下配置即可:
<system.webServer> <modules runAllManagedModulesForAllRequests="false"> <remove name="WebDAVModule" /> </modules> <handlers> <remove name="WebDAV" /> <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> </handlers> <!-- 避免IIS重复添加跨域头和后端CORS配置冲突 --> <httpProtocol> <customHeaders> <remove name="Access-Control-Allow-Origin" /> </customHeaders> </httpProtocol> </system.webServer>
2. 修正CORS配置冲突
你当前的CORS规则同时配置了WithOrigins(FrontEnd_URL)和SetIsOriginAllowed(_ => true),二者逻辑冲突,后者会直接覆盖前者的域名限制规则:
- 如果你需要限制仅指定前端域名可访问,直接删除
SetIsOriginAllowed((host) => true)这行即可 - 如果你需要允许所有源访问,删除
WithOrigins(FrontEnd_URL)这行即可
3. 确认中间件排序规则
如果你的代码中引入了身份认证、授权相关的中间件(UseAuthentication/UseAuthorization),必须保证UseCors放在这两个中间件之前,否则OPTIONS预检请求会被认证中间件拦截(预检请求默认不带身份凭证),无法到达CORS模块,就会报跨域错误。正确的中间件顺序参考:
app.UseRouting(); app.UseCors(CorsPolicy); // 必须放在授权、认证中间件之前 app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(...);
4. 定位预检请求具体报错
打开浏览器F12开发者工具,切换到「网络」面板,找到PUT请求对应的OPTIONS预检请求,查看响应状态码针对性排查:
- 响应码405:方法不被允许,确认第一步的WebDAV移除配置是否生效
- 响应码401:认证拦截,确认中间件顺序是否正确,也可以单独配置OPTIONS请求允许匿名访问
- 响应码500:服务端处理预检请求时报错,查看后端日志定位具体错误
内容的提问来源于stack exchange,提问作者HagerHassan
相关产品推荐
相关产品推荐

