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

.NET 7 Minimal Web API大文件上传大小限制配置失效问题

.NET 7 Minimal API大文件上传配置失效问题解决方案

问题描述

将.NET Core 2.1 Web API迁移至.NET 7 Minimal API,需支持50MB至300MB的文件(含视频)上传。已配置IISServerOptions和FormOptions但未生效,使用Swagger测试返回200状态码,但调试无法进入/upload端点。

当前Minimal API代码:

using Microsoft.AspNetCore.Http.Features;
using System.Net;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

builder.Services.Configure<IISServerOptions>(options =>
{
options.MaxRequestBodySize = 536870912;
});

builder.Services.Configure<FormOptions>(options =>
{
options.ValueLengthLimit = 536870912;
options.MultipartBodyLengthLimit = 536870912;
options.MultipartHeadersLengthLimit = 536870912;
});

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.MapGet("/", () => "hello world!");

app.MapPost("/upload", async (IFormFile file, string context = "") =>
{
string filename = Constants.GetFilepath(context, WebUtility.HtmlEncode(file.FileName));
using var stream = File.OpenWrite(filename);
await file.CopyToAsync(stream);
});

旧版.NET Core 2.1生效配置:

public class Startup
{
readonly string MyAllowSpecificOrigins = "_myAllowSpecificOrigins";
public Startup(IConfiguration configuration)
{
Configuration = configuration;
_ = new Constants(configuration);
}

    public IConfiguration Configuration { get; }
    
    public void ConfigureServices(IServiceCollection services)
    {
    
        services.Configure<FormOptions>(options =>
        {
            options.MultipartBodyLengthLimit = 322122547200;
        });
    
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }
    
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
            app.UseDeveloperExceptionPage();
        else
            app.UseHsts();
    
        app.UseCors(MyAllowSpecificOrigins);
    
        app.UseAuthentication();
        app.UseHttpsRedirection();
        app.UseMvc();
    
}

}

问题原因及解决办法

1. 缺失表单限制中间件

Minimal API中,仅通过services.Configure<FormOptions>配置还不够,需要在请求管道中显式添加UseFormLimits中间件,确保配置生效。

在app.UseHttpsRedirection()之后添加:

app.UseFormLimits(options =>
{
    options.MultipartBodyLengthLimit = 536870912; // 512MB
    options.ValueLengthLimit = 536870912;
    options.MultipartHeadersLengthLimit = 536870912;
});

2. 补充Kestrel服务器配置

如果程序运行在Kestrel而非IIS环境下,还需额外配置Kestrel的请求体大小限制:

builder.WebHost.ConfigureKestrel(options =>
{
    options.Limits.MaxRequestBodySize = 536870912; // 512MB
});

3. 明确参数绑定方式

Minimal API的参数绑定默认可能存在歧义,需给端点参数添加[FromForm]特性,确保表单数据正确绑定:

app.MapPost("/upload", async ([FromForm] IFormFile file, [FromForm] string context = "") =>
{
    // 原有上传逻辑
});

4. 添加异常排查机制

在开发环境启用异常页面,方便定位上传过程中的错误:

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
    app.UseDeveloperExceptionPage(); // 新增该行
}

完整修改后代码示例

using Microsoft.AspNetCore.Http.Features;
using System.Net;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

// 配置IIS服务器请求体大小
builder.Services.Configure<IISServerOptions>(options =>
{
    options.MaxRequestBodySize = 536870912; // 512MB
});

// 配置全局表单选项
builder.Services.Configure<FormOptions>(options =>
{
    options.ValueLengthLimit = 536870912;
    options.MultipartBodyLengthLimit = 536870912;
    options.MultipartHeadersLengthLimit = 536870912;
});

// 配置Kestrel服务器请求体大小
builder.WebHost.ConfigureKestrel(options =>
{
    options.Limits.MaxRequestBodySize = 536870912;
});

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
    app.UseDeveloperExceptionPage();
}

app.UseHttpsRedirection();
// 应用表单限制中间件
app.UseFormLimits(options =>
{
    options.MultipartBodyLengthLimit = 536870912;
    options.ValueLengthLimit = 536870912;
    options.MultipartHeadersLengthLimit = 536870912;
});

app.MapGet("/", () => "hello world!");

app.MapPost("/upload", async ([FromForm] IFormFile file, [FromForm] string context = "") =>
{
    if (file == null || file.Length == 0)
    {
        return Results.BadRequest("请选择要上传的文件");
    }
    try
    {
        string filename = Constants.GetFilepath(context, WebUtility.HtmlEncode(file.FileName));
        using var stream = File.OpenWrite(filename);
        await file.CopyToAsync(stream);
        return Results.Ok("文件上传成功");
    }
    catch (Exception ex)
    {
        return Results.StatusCode(StatusCodes.Status500InternalServerError, $"上传失败:{ex.Message}");
    }
});

app.Run();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 15:47:33