OnExceptionAsync与OnException之间的ExceptionFilter差异

Jur*_*uri 13 asp.net-mvc asp.net-web-api asp.net-web-api2

而已.

在MVC或WebApi中编写custome异常过滤器时,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
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 12

我认为OnExceptionAsync与异步Actions一起使用.

如果您想要一个简单的场景,例如发送错误的可序列化描述,则可以覆盖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
    };
}
Run Code Online (Sandbox Code Playgroud)

但您可能希望在数据库中记录异常并利用异步行为:

public override async Task OnExceptionAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken)
{
    await LogException(actionExecutedContext.Exception);
}
Run Code Online (Sandbox Code Playgroud)

async和await关键字将帮助您管理异步行为.您不需要返回Task对象.