MVC4でAPIコントローラを使用すると、コントローラのアクションが例外をスローすると、ELMAHはエラーを記録しません。MVC4のELMAHとAPIコントローラでエラーが記録されない
MVC4はHTTPステータスコードを500に設定し、例外の詳細をJSONオブジェクトに返しますが、未処理の例外をスローしないため、ELMAHはそれを見ないようにしています。
ステータスコードが200ではないすべての応答をELMAHで取得するにはどうすればよいですか?
MVC4でAPIコントローラを使用すると、コントローラのアクションが例外をスローすると、ELMAHはエラーを記録しません。MVC4のELMAHとAPIコントローラでエラーが記録されない
MVC4はHTTPステータスコードを500に設定し、例外の詳細をJSONオブジェクトに返しますが、未処理の例外をスローしないため、ELMAHはそれを見ないようにしています。
ステータスコードが200ではないすべての応答をELMAHで取得するにはどうすればよいですか?
前述のanwserが動作しません。私はテストサーバーを試してみましたが、エラーが発生しました(「与えられたフィルターインスタンスは、以下のフィルターインターフェイスを実装する必要があります:IAuthorizationFilter、IActionFilter、IResultFilter、IExceptionFilter」)。
それを修正するには、私は
をGlobalFilterにフィルタ登録を分割し、HttpFilterました。(filters.Add(新ElmahHandledErrorLoggerFilter()))..あなたは、MVCグローバルフィルタにカスタムフィルタを追加しようとしています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);
;-)
これはうまくいきました、ありがとうございます。 – jhilden
Web APIの現在のスキャフォールディングでは、フィルタはApp_Start/WebApiConfig.csに登録する必要があります。 config.Filters.Add(新しいElmahExceptionFilter()); –
Nuget Elmah.MVC経由でインストールしました。非常に簡単に行くことができますが、500のエラーを記録しません。私は上記の答えを理解していますが、ElmahHandledErrorLoggerFilter(上記のコードスニペットで示されています)がElmah。*またはElmah.Mvc。*スペースに表示されないようにしてください。EDIT:おっと、私は今あなた自身を書くクラスですOPのコードスニペットに表示されています。ごめんなさい! ;) – bkwdesign
最新の情報:この回答は最新のバージョンでは機能しません。ジュリアノックスの答えを使用してください。
こちらの情報は見つかり回答:例外フィルタログはELMAHするhttp://www.asp.net/web-api/overview/web-api-routing-and-actions/exception-handling
:
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());
}
すばらしいもの。私はこれに苦労し、ElmahフィルタをGlobalConfigurationに追加していませんでした。 –
これを実行したとき、GlobalConfiguration.Configuration.Filters.Add(新しいElmahHandledErrorLoggerFilter())を追加しない限り、全く動作しませんでした。 RegisterGlobalFiltersメソッドで指定します。フィルタではありません。追加(新しいElmahHandledErrorLoggerFilter());ラインはそれをやった?両方を持つことのポイントは何ですか? – JustinP8
@ JustinP8 WebApiは、既にMVCにあったものをほぼ完全に再現しています。これは、WebApiとMVCが異なるキャラクターであることがわかります.1つのUIは他のソフトウェアを指向しています。 GlobalConfiguration.Configuration.Filters(HttpFilterCollection)とGlobalFilters.Filters(GlobalFilterCollection)によって返される型をチェックアウトすると、それらが異なる獣であることがわかります。 – WooWaaBob
それはAPIコントローラは、Web API、ないMVCであることは注目におそらく価値があります。 Web APIを使用したMVCターゲットライブラリの非互換性の原因は、それぞれ個別の実行パスが原因です。各リクエストはMVCに進むか、Web APIに進む。 2つは並んでおり、相互作用しません(Web APIはMVC実行の機能ではありません)。彼らは異なった文脈、異なった経路表、異なった設定、すべて異なった、すべて別々です。 – StarTrekRedneck