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
相关产品推荐
相关产品推荐

