代码之家  ›  专栏  ›  技术社区  ›  Pavel Tupitsyn

RequestSizeLimitAttribute:HTTP 500而不是中的413ASP.NET核心2.1.401

  •  4
  • Pavel Tupitsyn  · 技术社区  · 6 年前

    我有 [RequestSizeLimit] 在我的API控制器上 按预期工作:大于指定限制的请求被拒绝。

        [HttpPut]
        [RequestSizeLimit(120_000_000)]
        public async Task<IActionResult> Put(IFormCollection form)
        {
           ...
        }
    

    Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException: Request body too large.
       at Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException.Throw(RequestRejectionReason reason)
       at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1MessageBody.ForContentLength.OnReadStarting()
       at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.MessageBody.TryInit()
       at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.MessageBody.ReadAsync(Memory`1 buffer, CancellationToken cancellationToken)
       at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpRequestStream.ReadAsyncInternal(Memory`1 buffer, CancellationToken cancellationToken)
    

    所以HTTP500被返回,但我希望是413或400。我不希望有例外,因为这是一个完全正常的情况。

    找不到有关此的任何文档。对于太大的请求,返回413的正确方法是什么?

    1 回复  |  直到 6 年前
        1
  •  4
  •   Alex Riabov Vikrant    6 年前

    public class ExceptionMiddleware
    {
        private readonly RequestDelegate _next;
    
        public ExceptionMiddleware(RequestDelegate next)
        {
            _next = next;
        }
    
        public async Task InvokeAsync(HttpContext httpContext)
        {
            try
            {
                await _next(httpContext);
            }
            catch (Exception ex)
            {
                HandleExceptionAsync(httpContext, ex);
            }
        }
    
        private static void HandleExceptionAsync(HttpContext context, Exception exception)
        {
            if (exception is BadHttpRequestException badRequestException && badRequestException.Message == "Request body too large.")
            {
                context.Response.StatusCode = (int) HttpStatusCode.RequestEntityTooLarge;
            }
        }
    }
    

    在配置中注册启动.cs:

    public void Configure(IApplicationBuilder app)
    {
        ...
        app.UseMiddleware<ExceptionMiddleware>();
        ...
    }
    

    作为替代,您也可以使用 Exception filter