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

.NET 6 Core API部署IIS后文件上传接口遭CORS拦截问题排查

文件上传接口跨域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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 11:35:25