17

MVC3とは異なるように見えるため、MVC4にグローバル例外ハンドラーを実装するにはどうすればよいですか。

以下を実装する方法がわからない:

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

2 に答える 2

34

残念ながら、Eric Leschinskiのコメットで提供されているリンクは、System.Web.Http.Filters.IExceptionFilterインターフェイスではなく、System.Web.Mvc.IExceptionFilterインターフェイス実装する方法のみを示しています。1つ目は通常のMVCコントローラーで使用され、2つ目はApiCotrollersを対象としています。

これは、ApiControllersでスローされた未処理の例外をログに記録するために思いついた簡単なクラスの例です。

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.asaxApplication_Startメソッドに登録することだけです。

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);
}

これが他のグーグルに役立つことを願っています!

于 2013-10-20T17:27:25.277 に答える
11

その一部のMVC部分の例外ハンドラーを作成した方法で、IExceptionFilterを実装するクラスを作成しました

public class MVCExceptionFilter : IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        Trace.TraceError(filterContext.Exception.ToString());
    }
}

次に、それを内部のGlobal.asax.csに登録しますprotected void Application_Start()

メソッドにはすでに行が含まれています

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

したがって、この行をその上に追加する必要があります

GlobalFilters.Filters.Add(new MVCExceptionFilter());
于 2014-03-31T15:26:37.467 に答える