为了账号安全,请及时绑定邮箱和手机立即绑定

HTTP 500 而不是 ASP.NET Core 2.1.401 中的 413

HTTP 500 而不是 ASP.NET Core 2.1.401 中的 413

C#
米琪卡哇伊 2022-01-09 15:38:23
我有[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)因此返回 HTTP 500,但我希望返回 413 或 400。而且我不希望出现异常,因为这是完全正常的情况。找不到有关此的任何文档。对于太大的请求,返回 413 的正确方法是什么?
查看完整描述

3 回答

?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

Kestrel 响应 413 Payload Too Large 响应,但 HttpSys 响应通用 500 Internal Server Error 响应。我假设您使用第二个。在这种情况下,您可以实现异常处理 middelware 来处理这种情况:


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;

        }

    }

}

并在 Startup.cs 中的 Configure 中注册:


public void Configure(IApplicationBuilder app)

{

    ...

    app.UseMiddleware<ExceptionMiddleware>();

    ...

}


查看完整回答
反对 回复 2022-01-09
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

基于 Alex Riabov 的回答,现在可以在不解析文本的情况下捕获实际的内部错误代码。


所以异常处理程序的更新部分是:


private static void HandleExceptionAsync(HttpContext context, Exception exception)

{

    if (exception is BadHttpRequestException badRequestException && badRequestException.StatusCode == StatusCodes.Status413PayloadTooLarge)

    {

        context.Response.StatusCode = badRequestException.StatusCode;

    }

}


查看完整回答
反对 回复 2022-01-09
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

我在 Visual Studio 的调试中运行时遇到了同样的行为。我发现了它的DeveloperExceptionPageMiddleware原因。我fail: Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware在BadHttpRequestException异常上方的服务器日志中注意到。


Startup.cs如预期的那样,从我的中删除它会给出 413 个响应。


if (env.IsDevelopment())

    app.UseDeveloperExceptionPage();

现在显示服务器日志fail: Microsoft.AspNetCore.Server.Kestrel。


查看完整回答
反对 回复 2022-01-09
  • 3 回答
  • 0 关注
  • 187 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信