Asp.net-Mvc
OnExceptionAsync 與 OnException 之間的 ExceptionFilter 區別
而已。
在 MVC 或 WebApi 中編寫自定義異常過濾器時, OnExceptionAsync和OnException方法有什麼區別?是不是只有在使用非同步控制器時才呼叫 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 對象。