6

MVC4 アプリケーションで使用する Custom HandleErrorAttribute を取得できません。

例外をログに記録するカスタム クラス

  public class HandleAndLogErrorAttribute : HandleErrorAttribute
  {
    private static readonly Logger Logger = LogManager.GetCurrentClassLogger();

    public override void OnException(ExceptionContext filterContext)
    {
      var message = string.Format("Exception     : {0}\n" +
                                  "InnerException: {1}", 
                                  filterContext.Exception,
                                  filterContext.Exception.InnerException);
      Logger.Error(message);
      base.OnException(filterContext);
    }
  }

Global.asax に、新しい静的メソッドを追加しました。

  public class MvcApplication : System.Web.HttpApplication
  {
    protected void Application_Start()
    {
      AreaRegistration.RegisterAllAreas();

      WebApiConfig.Register(GlobalConfiguration.Configuration);
      FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
      RouteConfig.RegisterRoutes(RouteTable.Routes);
    }

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
      filters.Add(new HandleAndLogErrorAttribute()); //Todo: log all errors
      throw new Exception("not called???");
    }

  }

例外がスローされると、error.chstml が読み込まれますが、カスタム HandlErrorAttribute の OnException オーバーライドは呼び出されません。

Global.asax の RegisterGlobalFilters メソッドが呼び出されていないと思われ、そこで例外をスローすると (コードを参照)、これが確認されます。その例外はスローされません。

web.config ファイルで、customErrors をオンに設定しました。

<customErrors mode="On">
</customErrors>

別のソリューションで同じアプローチを使用しましたが、この HandleErrorAttribute 拡張が機能しない理由がわかりません。

4

1 に答える 1

11

RegisterGlobalFilters内にメソッドを作成しましGlobal.asaxたが、MVC 4 以降、グローバル フィルターの登録は の別のファイルで指定されますApp_Start/FilterConfig.cs

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters)あなたの行Global.asaxは、指定されたファイルで定義された登録を呼び出しています。

指定したファイルにカスタム フィルターの登録を追加するか、手動で (ローカル)RegisterGlobalFiltersを呼び出しますApplication_Start

于 2013-07-03T15:16:29.117 に答える