Asp.net-Mvc

OnExceptionAsync 與 OnException 之間的 ExceptionFilter 區別

  • July 18, 2019

而已。

在 MVC 或 WebApi 中編寫自定義異常過濾器時, OnExceptionAsyncOnException方法有什麼區別?是不是只有在使用非同步控制器時才呼叫 OnExceptionAsync ?或者兩者都被呼叫?

什麼時候用哪個?

如何使用返回任務結果的 OnExceptionAsync?

一些基本程式碼來說明:

public class ApiExceptionFilterAttribute : ExceptionFilterAttribute
{
   public override void OnException(HttpActionExecutedContext actionExecutedContext)
   {
       //TODO exception handling
   }

   public override Task OnExceptionAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken)
   {
       //TODO exception handling
   }
}

我認為 OnExceptionAsync 與非同步操作一起使用。

如果你想要一個簡單的場景,比如發送一個可序列化的錯誤描述,你可以覆蓋 OnException 而不是 OnExceptionAsync,因為 OnExceptionAsync 在ExceptionFilterAttribute 預設實現中呼叫 OnException :

public override void OnException(System.Web.Http.Filters.HttpActionExecutedContext actionExecutedContext)
{
   actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse(HttpStatusCode.InternalServerError, new 
   {
       Message = "An unexpected error has occured",
       Description = actionExecutedContext.Exception.Message
   });

   actionExecutedContext.Response.Headers.CacheControl = new System.Net.Http.Headers.CacheControlHeaderValue()
   {
       NoCache = true,
       NoStore = true
   };
}

但是您可能希望在數據庫中記錄異常並利用非同步行為:

public override async Task OnExceptionAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken)
{
   await LogException(actionExecutedContext.Exception);
}

async 和 await 關鍵字將為您管理非同步行為。您不需要返回 Task 對象。

引用自:https://stackoverflow.com/questions/25031038