asp.net-mvc - OnExceptionAsync 与 OnException 之间的 ExceptionFilter 区别

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

就是这样。

在MVC或WebApi中编写自定义异常过滤器时,OnExceptionAsyncOnException方法有什么区别? 是否仅在使用异步 Controller 时才调用 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 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 对象。

关于asp.net-mvc - OnExceptionAsync 与 OnException 之间的 ExceptionFilter 区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25031038/

相关文章:

html - 如果没有javascript没有返回内容,如何隐藏iframe

asp.net-mvc - ASP.Net MVC Bundle 链接内容文件

c# - 如何在 .Net 中优雅地关闭双向 WebSocket

asp.net - 不允许用于访问此页面的 HTTP 谓词 Web Api IIS 7

c# - LINQ to Entities 不支持指定的类型成员 'UserName'

javascript - 输入的日期比较,客户端 MVC

c# - 如何使用 AuthorizationOptions 中设置的 FallbackPolicy 为不正确的 url 返回 HttpStatusCode 404?

c# - 在 ASP.NET Core 6 Program.cs 中配置 EF

c# - WebApp.Start<TStartup> 方法类型参数

c# - 序列包含多个元素 Microsoft.Owin.Security.AuthenticationManager