Asp.net mvc MVC4全局异常过滤器如何实现?
我如何在MVC4中实现全局异常处理程序,因为它似乎与MVC3不同 不确定如何实现以下功能: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
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控制器,所以我需要实现这两个过滤器,它们基本上是一样的,所以我将我们的过滤器分解为一个服务类。