You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET5部署到IIS后仅PUT/DELETE请求报CORS跨域错误如何解决

问题原因

  • IIS默认拦截了OPTIONS预检请求,没有转发到.NET 5应用处理,代码中配置的CORS策略完全没有生效。从你贴出的OPTIONS响应头可以验证这点:你代码中明确配置了只允许http://localhost:3000跨域,但实际响应返回的access-control-allow-origin是*,明显是IIS自带的CORS模块提前处理了请求,没有走到你写的CORS逻辑。
  • IIS的WebDAV模块和请求筛选模块默认禁用了PUT、DELETE这类非常用HTTP动词,就算预检请求通过,后续的实际业务请求也会被IIS直接拦截,返回不带CORS头的错误响应。
  • 部署站点的IIS全局可能配置了CORS规则,和代码中的CORS策略冲突,导致响应头重复或者不符合跨域要求。

解决办法

步骤1:移除IIS默认的OPTIONS和WebDAV处理逻辑

在你的.NET 5项目根目录下添加web.config文件(如果已有就直接修改),在<system.webServer>节点下添加以下配置,让所有请求都转发到ASP.NET Core处理:

<modules runAllManagedModulesForAllRequests="false">
  <remove name="WebDAVModule" />
</modules>
<handlers>
  <remove name="WebDAV" />
  <remove name="OPTIONSVerbHandler" />
  <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>

步骤2:配置IIS请求筛选允许指定HTTP动词

同样在web.config的<system.webServer>节点下添加以下配置,放开PUT、DELETE、OPTIONS等动词的访问限制:

<security>
  <requestFiltering>
    <verbs allowUnlisted="false">
      <add verb="GET" allowed="true" />
      <add verb="POST" allowed="true" />
      <add verb="PUT" allowed="true" />
      <add verb="DELETE" allowed="true" />
      <add verb="OPTIONS" allowed="true" />
    </verbs>
  </requestFiltering>
</security>

步骤3:清理IIS全局CORS配置

打开IIS管理器,找到你部署的站点,进入「HTTP响应标头」和「CORS」功能页,删除所有手动添加的Access-Control-*开头的响应头配置,避免和代码返回的CORS头冲突。

步骤4:(可选)适配带身份凭证的请求

如果你的请求携带Cookie、Authorization头这类身份凭证,可以修改CORS配置添加AllowCredentials()即可,你当前的中间件顺序UseRouting()→UseCors()→UseAuthorization()是正确的不需要调整:

builder
  .AllowAnyHeader()
  .AllowAnyMethod()
  .WithOrigins("http://localhost:3000")
  .AllowCredentials();

配置完成后重启IIS站点即可生效,此时OPTIONS请求会由你的.NET代码处理,返回的Access-Control-Allow-Origin会是你配置的http://localhost:3000而非*,PUT、DELETE请求也可以正常跨域访问。

内容的提问来源于stack exchange,提问作者Abhishek Prajapati

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 21:39:03