MVC4でAPIコントローラーを使用すると、コントローラーアクションが例外をスローした場合、ELMAHはエラーをログに記録しません。
問題は、MVC4がHTTPステータスコードを500に設定し、JSONオブジェクトで例外の詳細を返すことですが、未処理の例外をスローしないため、ELMAHはそれを認識しません。
ステータスコードが200でないすべての応答をELMAHにキャプチャさせるにはどうすればよいですか?
MVC4でAPIコントローラーを使用すると、コントローラーアクションが例外をスローした場合、ELMAHはエラーをログに記録しません。
問題は、MVC4がHTTPステータスコードを500に設定し、JSONオブジェクトで例外の詳細を返すことですが、未処理の例外をスローしないため、ELMAHはそれを認識しません。
ステータスコードが200でないすべての応答をELMAHにキャプチャさせるにはどうすればよいですか?
前に説明した答えは機能しません。テストサーバーを試してみましたが、エラーが発生しました(「指定されたフィルターインスタンスは、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);
;-)
更新:この回答は最新バージョンでは機能しません。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());
}