亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 223 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號