Asp.net mvc MVC4全局异常过滤器如何实现?

Asp.net mvc MVC4全局异常过滤器如何实现?,asp.net-mvc,asp.net-mvc-4,Asp.net Mvc,Asp.net Mvc 4,我如何在MVC4中实现全局异常处理程序,因为它似乎与MVC3不同 不确定如何实现以下功能: public class ErrorHandlerAttribute: System.Web.Mvc.FilterAttribute, IExceptionFilter { public Task ExecuteExceptionFilterAsync( HttpActionExecutedConte

我如何在MVC4中实现全局异常处理程序,因为它似乎与MVC3不同

不确定如何实现以下功能:

public class ErrorHandlerAttribute: System.Web.Mvc.FilterAttribute, 
                                    IExceptionFilter
{
    public Task ExecuteExceptionFilterAsync(
            HttpActionExecutedContext actionExecutedContext, 
            CancellationToken cancellationToken)
    {
        throw new NotImplementedException();
    }
}

不幸的是,Eric Leschinski的commet中提供的链接只显示了如何实现接口,而没有显示接口。第一个用于常规MVC控制器,而第二个用于目标

下面是一个简单的类示例,用于记录ApicController中抛出的未处理异常:

public class ExceptionLoggerFilter: IExceptionFilter
{
    public ExceptionLoggerFilter(Logger logger)
    {
        this.logger = logger;
    }

    public bool AllowMultiple { get { return true; } }

    public Task ExecuteExceptionFilterAsync(
            HttpActionExecutedContext actionExecutedContext,
            CancellationToken cancellationToken)
    {
        return Task.Factory.StartNew(() =>
        {
            logger.Error("web service error", actionExecutedContext.Exception);
        }, cancellationToken);
    }

    private Logger logger;
}
要启用此筛选器,您只需将其注册到您的Global.asax应用程序\u启动方法中:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    // allocate filter and add it to global configuration
    var exceptionLogger = new ExceptionLoggerFilter(Container.Get<Logger>());
    GlobalConfiguration.Configuration.Filters.Add(exceptionLogger);

    WebApiConfig.Register(GlobalConfiguration.Configuration);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
}
受保护的无效应用程序\u Start()
{
RegisterAllAreas();
//分配筛选器并将其添加到全局配置
var exceptionLogger=新的ExceptionLoggerFilter(Container.Get());
GlobalConfiguration.Configuration.Filters.Add(exceptionLogger除外);
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
}

我希望这能帮助其他谷歌用户

按照我为MVC创建异常处理程序的方式,我创建了一个实现IEExceptionFilter的类

public class MVCExceptionFilter : IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        Trace.TraceError(filterContext.Exception.ToString());
    }
}
然后在Global.asax.cs中注册它 内部
受保护的无效应用程序\u Start()

该方法已包含该行

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
因此,您需要在其上方添加这一行

GlobalFilters.Filters.Add(new MVCExceptionFilter());

关于如何在MVC中生成全局异常处理程序,这家伙有一个非常好的演练:您也可以在global.asax文件中实现application_Error,如果这对您有效,为什么要调用Task.Factory.StartNew?这与Task.Run相同吗?实际上没有什么特别的原因。调用Task.Run相当于Task.Factory.StartNew传入一些默认参数()。但是你是对的,自从.NET Framework 4.5中引入Task.Run方法以来,它已成为计划任务执行的推荐方法在我得到的
RegisterGlobalFilters
FilterConfig.cs中,给定的筛选器实例必须实现以下一个或多个筛选器接口:System.Web.Mvc.IAAuthorizationFilter、System.Web.Mvc.IActionFilter、System.Web.Mvc.IResultFilter、System.Web.Mvc.IEExceptionFilter、,System.Web.Mvc.Filters.iaauthenticationfilter.我必须执行
config.Filters.Add(new-apieexceptionfilter())
WebApiConfig.cs
中,我也有MVC和API控制器,所以我需要实现这两个过滤器,它们基本上是一样的,所以我将我们的过滤器分解为一个服务类。