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

