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

ASP.NET Core Web API:将HTTP 413转为400响应的实现求助

解决方案:将ASP.NET Core的413状态码转为400响应

要解决RequestSizeLimit触发的413状态码无法被WPF客户端处理的问题,核心是在请求管道的最早期拦截413响应,将其替换为400状态码和自定义JSON描述。普通中间件或异常处理器无法生效的原因是,413是在ASP.NET Core解析请求体的早期阶段触发的,常规中间件注册顺序靠后,没机会处理。

实现步骤

1. 自定义拦截中间件

创建一个中间件,在请求处理完成后检查响应状态码,若为413则重置响应并返回400:

public class RequestSizeLimitMiddleware
{
    private readonly RequestDelegate _next;

    public RequestSizeLimitMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        // 先执行后续管道逻辑
        await _next(context);

        // 拦截413状态码
        if (context.Response.StatusCode == StatusCodes.Status413PayloadTooLarge)
        {
            // 重置响应(清除已写入的头部/内容)
            context.Response.Clear();
            // 设置新状态码
            context.Response.StatusCode = StatusCodes.Status400BadRequest;
            context.Response.ContentType = "application/json";

            // 构造自定义错误响应
            var errorResponse = new
            {
                Message = "上传内容过大,请减小文件大小后重试",
                ErrorCode = "PayloadExceeded"
            };

            var json = System.Text.Json.JsonSerializer.Serialize(errorResponse);
            await context.Response.WriteAsync(json);
        }
    }
}

2. 通过IStartupFilter注册中间件

使用IStartupFilter确保中间件在框架自带中间件之前运行,保证能捕获到早期触发的413响应:

public class RequestSizeLimitStartupFilter : IStartupFilter
{
    public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
    {
        return app =>
        {
            // 优先注册自定义中间件
            app.UseMiddleware<RequestSizeLimitMiddleware>();
            // 执行后续框架中间件配置
            next(app);
        };
    }
}

3. 注册StartupFilter

在服务配置中添加这个StartupFilter:

Program.cs(.NET 6+)

builder.Services.AddTransient<IStartupFilter, RequestSizeLimitStartupFilter>();

Startup.cs(.NET 5及更早)

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<IStartupFilter, RequestSizeLimitStartupFilter>();
    // 其他服务配置...
}

4. 配置RequestSizeLimit

确保你已经在全局或控制器方法上配置了请求大小限制:

全局配置(Program.cs)

builder.Services.Configure<Microsoft.AspNetCore.Http.Features.FormOptions>(options =>
{
    // 设置允许的最大请求体大小(示例:10MB)
    options.MultipartBodyLengthLimit = 10 * 1024 * 1024;
});

控制器方法局部配置

[RequestSizeLimit(10 * 1024 * 1024)]
[HttpPost("upload")]
public IActionResult Upload(IFormFile file)
{
    // 上传逻辑...
}

验证

上传超过限制的文件,此时服务会返回状态码400,以及自定义的JSON响应,WPF客户端可直接处理该状态码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 10:30:53