.NET 6 Core API部署IIS后文件上传接口遭CORS拦截问题排查
问题场景
.NET 6 Core API部署至本地网络IIS服务器后,前端通过axios发起
multipart/form-data类型的文件上传POST请求(调用submitfile接口)时,浏览器控制台提示:Access to XMLHttpRequest at 'http://192.168.68.107:8090/api/Files/submitfile' from origin 'http://192.168.68.100:5173' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
本地运行API时请求正常,另一个接收FromBody参数的new-category接口跨域请求也正常,且已配置允许任意源、请求头、请求方法的CORS策略。
可能的原因
- IIS层级CORS拦截:IIS原生CORS模块或请求过滤、URL重写规则,可能拦截了.NET Core返回的CORS响应头。
- 文件上传请求的特殊处理:
multipart/form-data请求的预检逻辑、请求头处理和普通FromBody请求存在差异,现有CORS配置未覆盖这类场景。 - IIS请求限制触发:文件上传请求超出IIS默认请求长度限制,导致请求在到达.NET Core中间件前被截断,CORS头无法返回。
- CORS中间件顺序错误:CORS中间件注册位置靠后,在路由、认证等中间件之后,导致文件上传请求未经过CORS处理就被拦截。
解决步骤
1. 调整.NET Core CORS中间件顺序
确保CORS中间件在日志、异常处理之外的所有中间件之前注册,尤其是路由、认证中间件。示例代码:
var builder = WebApplication.CreateBuilder(args); // 优先添加CORS服务 builder.Services.AddCors(options => { options.AddPolicy("AllowAll", policy => { policy.AllowAnyOrigin() .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials(); // 若前端携带凭据需开启 }); }); builder.Services.AddControllers(); var app = builder.Build(); // 优先启用CORS中间件 app.UseCors("AllowAll"); // 再启用其他中间件 app.UseAuthorization(); app.MapControllers(); app.Run();
2. 禁用IIS原生CORS模块
若IIS安装了CORS模块,会与.NET Core的CORS配置冲突,可在web.config中添加配置禁用:
<system.webServer> <modules> <remove name="CorsModule" /> </modules> <httpProtocol> <customHeaders> <remove name="Access-Control-Allow-Origin" /> </customHeaders> </httpProtocol> </system.webServer>
3. 配置IIS与.NET Core的请求长度限制
文件上传请求可能因默认长度限制被拦截,需同时配置IIS和.NET Core:
- 在web.config中增加IIS请求限制:
<system.webServer> <security> <requestFiltering> <!-- 示例为100MB,单位字节 --> <requestLimits maxAllowedContentLength="104857600" /> </requestFiltering> </security> </system.webServer>
- 在Program.cs中配置.NET Core的表单请求限制:
builder.Services.Configure<Microsoft.AspNetCore.Http.Features.FormOptions>(options => { options.MultipartBodyLengthLimit = 104857600; // 100MB options.ValueLengthLimit = int.MaxValue; });
4. 检查接口特性配置
确保submitfile接口未被错误配置[DisableCors],且[EnableCors]指定了正确的策略名称:
[ApiController] [Route("api/[controller]")] [EnableCors("AllowAll")] // 匹配配置的CORS策略名称 public class FilesController : ControllerBase { [HttpPost("submitfile")] public async Task<IActionResult> SubmitFile(IFormFile file) { // 接口逻辑 return Ok(); } }
5. 排查IIS其他拦截模块
检查站点是否配置了URL重写、请求过滤等模块,临时禁用这些模块测试是否解决问题,确认是否是模块拦截导致CORS头无法返回。
内容的提问来源于stack exchange,提问作者swapmeet_Lou

