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

IIS部署Next.js与.NET Core后端出现CORS问题及解决咨询

.NET Core后端部署IIS后CORS问题排查与解决

差异原因

  • Visual Studio运行时,后端直接使用Kestrel服务器,CORS中间件能按代码逻辑正常处理请求并添加响应头。
  • 部署到IIS后,IIS作为托管容器/反向代理会接管请求处理:
    • 代码里的builder.WebHost.UseUrls("http://0.0.0.0:7547")在IIS环境下会被忽略,IIS会自行管理端口绑定,这行代码仅对Kestrel单独运行有效。
    • 若CORS中间件调用顺序错误(比如放在UseRouting之前或UseAuthorization之后),IIS部署时中间件无法正确拦截请求,导致响应头缺失。
    • IIS自身的响应头配置可能覆盖或干扰后端CORS中间件生成的头信息。

解决方法

1. 修正CORS中间件调用顺序

CORS中间件必须放在UseRouting之后、UseAuthorization之前,否则无法正确生效。调整后的完整代码示例:

var builder = WebApplication.CreateBuilder(args);

// 注册CORS策略
builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowAllOrigins",
        policyBuilder =>
        {
            policyBuilder.AllowAnyOrigin()
                   .AllowAnyMethod()
                   .AllowAnyHeader();
        });
});

// 注册控制器等其他服务
builder.Services.AddControllers();

var app = builder.Build();

// 中间件顺序严格遵循:路由 → CORS → 授权 → 控制器映射
app.UseRouting();

app.UseCors("AllowAllOrigins"); // 关键位置,不能乱序

app.UseAuthorization();

app.MapControllers();

app.Run();

2. 检查IIS站点配置

  • 打开IIS管理器,找到后端站点进入「HTTP响应头」,确认没有手动添加Access-Control-Allow-Origin等CORS相关头,避免和后端中间件冲突。
  • 若后端采用进程外托管(web.config中<aspNetCore>节点的hostingModel为OutOfProcess),需确保web.config的重写规则正确转发请求到Kestrel,示例配置:
<system.webServer>
  <httpProtocol>
    <customHeaders>
      <!-- 不要在此处配置CORS头,交给后端中间件处理 -->
    </customHeaders>
  </httpProtocol>
  <rewrite>
    <rules>
      <rule name="Forward to Kestrel" stopProcessing="true">
        <match url="(.*)" />
        <action type="Rewrite" url="http://localhost:7547/{R:1}" />
      </rule>
    </rules>
  </rewrite>
  <aspNetCore processPath="dotnet" arguments=".\YourBackend.dll" hostingModel="OutOfProcess" />
</system.webServer>

注意替换YourBackend.dll为你的后端程序集名称,localhost:7547为Kestrel实际监听的端口。

3. 优先使用进程内托管

进程内托管(hostingModel="InProcess")下IIS直接调用后端应用,减少请求转发环节,CORS中间件更容易正常工作。


原报错信息

Access to fetch at 'http://192.168.29.36:7547/api/Users/userLogin' from origin 'http://192.168.29.36:7501' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled

原配置代码

var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseUrls("http://0.0.0.0:7547");
// Add CORS policy
builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowAllOrigins",
        builder =>
        {
            builder.AllowAnyOrigin()
                   .AllowAnyMethod()
                   .AllowAnyHeader();
        });
});
app.UseCors("AllowAllOrigins");

内容的提问来源于stack exchange,提问作者P M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 21:18:13