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

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

在 ASP.NET Core MVC 中捕獲異常

在 ASP.NET Core MVC 中捕獲異常

C#
慕哥9229398 2022-01-09 15:19:45
我已經在 ASP.NET MVC Core 中看到了多種捕獲異常的方法,但我需要了解為什么我所做的沒有按預期工作。我添加了以下內容:public abstract class GenericActionFilter : ActionFilterAttribute{    protected readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);    public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)    {        if (await OnBeforeActionExecutionAsync(context))        {            var executed = await next();            if (executed.Exception != null && !executed.ExceptionHandled)            {                await OnExceptionAsync(context, executed.Exception);            }            else            {                await OnAfterActionExecutionAsync(context);            }        }    }    public virtual Task<bool> OnBeforeActionExecutionAsync(ActionExecutingContext context)    {        return Task.FromResult(true);    }    public virtual Task OnAfterActionExecutionAsync(ActionExecutingContext context)    {        return Task.CompletedTask;    }    public virtual Task OnExceptionAsync(ActionExecutingContext context, Exception ex)    {        return Task.CompletedTask;    }}并像這樣使用它:public class ExceptionFilter : GenericActionFilter{    public IntegrationScenarioSettings Settings { get; set; }    public override Task OnExceptionAsync(ActionExecutingContext context, Exception ex)    {        context.Result = new ContentResult        {            Content = Settings.ApiExecutionExceptionMessage,            StatusCode = (int)HttpStatusCode.ServiceUnavailable        };        //outputs to endpoint.log        Logger.Error(ex);        return Task.CompletedTask;    }}動作中的底層代碼拋出異常,而不是看到 503,我仍然是 500。我在這里缺少什么?
查看完整描述

1 回答

?
米琪卡哇伊

TA貢獻1998條經驗 獲得超6個贊

為了通知 ASP.NET Core MVC 管道您已處理異常,您需要設置ActionExecutedContext.ExceptionHandled為true. 因為您在顯示的代碼中沒有此功能,所以 ASP.NET Core MVC 管道使用其自己的錯誤處理邏輯將您的(它認為是)未處理的異常轉換為 500 響應。


現在 - 此屬性存在于ActionExecutedContext而不是ActionExecutingContext(您在代碼中使用)。這是有道理的,因為它ActionExecutingContext代表了動作運行之前的狀態,也代表了動作運行之后的ActionExecutedContext狀態。這意味著您將需要以下一組更改:


更新你的OnExceptionAsync函數來ActionExecutedContext代替ActionExecutingContext.

更新對 的調用OnExceptionAsync,提供executed而不是context。當您在這里時,您還可以將方法參數折疊為僅 executed(我將在下面的代碼中顯示)。

設置context.ExceptionHandled為true一旦你已經處理了異常。:)

我已經從您的問題中獲取了代碼,刪除了一些與問題無關的代碼并應用了這些更改,我用上面的相應數字調用了這些更改:


public abstract class GenericActionFilter : ActionFilterAttribute

{

    public override async Task OnActionExecutionAsync(ActionExecutingContext context,

        ActionExecutionDelegate next)

    {

        if (await OnBeforeActionExecutionAsync(context))

        {

            var executed = await next();


            if (executed.Exception != null && !executed.ExceptionHandled)

            {

                await OnExceptionAsync(executed); // #2.

            }

            else

            {

                // NOTE: You might want to use executed here too.

                await OnAfterActionExecutionAsync(context);

            }

        }

    }


    // ...


    public virtual Task OnExceptionAsync(ActionExecutedContext context) // #1.

    {

        return Task.CompletedTask;

    }

}

public class ExceptionFilter : GenericActionFilter

{    

    public override Task OnExceptionAsync(ActionExecutedContext context) // #1, #2.

    {

        Logger.Error(context.Exception); // #2 (single parameter).


        context.Result = new ContentResult { ... };

        context.ExceptionHandled = true; // #3.


        return Task.CompletedTask;

    }

}


查看完整回答
反對 回復 2022-01-09
  • 1 回答
  • 0 關注
  • 353 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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