12

MVC4でAPIコントローラーを使用すると、コントローラーアクションが例外をスローした場合、ELMAHはエラーをログに記録しません。

問題は、MVC4がHTTPステータスコードを500に設定し、JSONオブジェクトで例外の詳細を返すことですが、未処理の例外をスローしないため、ELMAHはそれを認識しません。

ステータスコードが200でないすべての応答をELMAHにキャプチャさせるにはどうすればよいですか?

4

2 に答える 2

22

前に説明した答えは機能しません。テストサーバーを試してみましたが、エラーが発生しました(「指定されたフィルターインスタンスは、IAuthorizationFilter、IActionFilter、IResultFilter、IExceptionFilterの1つ以上のフィルターインターフェイスを実装する必要があります。」)

次に、何が起こったのかを理解しました....カスタムフィルターをMVCグローバルフィルターに追加しようとしています(filters.Add(new ElmahHandledErrorLoggerFilter());)

これを修正するために、GlobalFilterとHttpFilterでフィルター登録を分割しました

FilterConfig.cs

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }

    public static void RegisterHttpFilters(HttpFilterCollection filters)
    {
        filters.Add(new ElmahHandledErrorLoggerFilter());
    }

Global.asax

    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    FilterConfig.RegisterHttpFilters(GlobalConfiguration.Configuration.Filters);

;-)

于 2012-11-07T06:50:38.037 に答える
16

更新:この回答は最新バージョンでは機能しません。julianoxの答えを使用してください。

ここの情報から見つかった回答:http ://www.asp.net/web-api/overview/web-api-routing-and-actions/exception-handling

例外フィルターがelmahにログを記録する場所:

public class ElmahHandledErrorLoggerFilter : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext actionExecutedContext)
    {
        base.OnException(actionExecutedContext);

        ErrorSignal.FromCurrentContext().Raise(actionExecutedContext.Exception);
    }
}

ただし、GlobalConfigurationフィルターにエラーフィルターを追加する必要もあります。

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        GlobalConfiguration.Configuration.Filters.Add(new ElmahHandledErrorLoggerFilter());
        filters.Add(new ElmahHandledErrorLoggerFilter());
        filters.Add(new HandleErrorAttribute());
    }
于 2012-04-09T01:04:50.390 に答える