【问题标题】:ExceptionFilter difference between OnExceptionAsync vs.OnExceptionOnExceptionAsync 与 OnException 之间的 ExceptionFilter 区别
【发布时间】:2014-09-21 18:05:02
【问题描述】:

就是这样。

在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
    }
}

【问题讨论】:

  • yes OnExceptionAsync 过滤器适用于 mvc 5 中的最新异步控制器

标签: asp.net-mvc asp.net-web-api asp.net-web-api2


【解决方案1】:

我认为 OnExceptionAsync 与异步操作一起使用。

如果你想要一个简单的场景,比如发送一个可序列化的错误描述,你可以覆盖 OnException 而不是 OnExceptionAsync,因为 OnExceptionAsync 在 ExceptionFilterAttribute default implementation 中调用 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 对象。

【讨论】:

  • 感谢您对 OnExceptionAsync 方法的一些了解,看来您是对的。
猜你喜欢
  • 2017-12-14
  • 2019-04-09
  • 2014-10-30
  • 2021-12-07
  • 2016-02-09
  • 2016-05-14
  • 2016-10-11
  • 2015-06-02
  • 2018-04-08
相关资源
最近更新 更多