2012-04-08 9 views
12

MVC4でAPIコントローラを使用すると、コントローラのアクションが例外をスローすると、ELMAHはエラーを記録しません。MVC4のELMAHとAPIコントローラでエラーが記録されない

MVC4はHTTPステータスコードを500に設定し、例外の詳細をJSONオブジェクトに返しますが、未処理の例外をスローしないため、ELMAHはそれを見ないようにしています。

ステータスコードが200ではないすべての応答をELMAHで取得するにはどうすればよいですか?

+3

それはAPIコントローラは、Web API、ないMVCであることは注目におそらく価値があります。 Web APIを使用したMVCターゲットライブラリの非互換性の原因は、それぞれ個別の実行パスが原因です。各リクエストはMVCに進むか、Web APIに進む。 2つは並んでおり、相互作用しません(Web APIはMVC実行の機能ではありません)。彼らは異なった文脈、異なった経路表、異なった設定、すべて異なった、すべて別々です。 – StarTrekRedneck

答えて

22

前述の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); 

;-)

+0

これはうまくいきました、ありがとうございます。 – jhilden

+2

Web APIの現在のスキャフォールディングでは、フィルタはApp_Start/WebApiConfig.csに登録する必要があります。 config.Filters.Add(新しいElmahExceptionFilter()); –

+0

Nuget Elmah.MVC経由でインストールしました。非常に簡単に行くことができますが、500のエラーを記録しません。私は上記の答えを理解していますが、ElmahHandledErrorLoggerFilter(上記のコードスニペットで示されています)がElmah。*またはElmah.Mvc。*スペースに表示されないようにしてください。EDIT:おっと、私は今あなた自身を書くクラスですOPのコードスニペットに表示されています。ごめんなさい! ;) – bkwdesign

16

最新の情報:この回答は最新のバージョンでは機能しません。ジュリアノックスの答えを使用してください。

こちらの情報は見つかり回答:例外フィルタログは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()); 
    } 
+0

すばらしいもの。私はこれに苦労し、ElmahフィルタをGlobalConfigurationに追加していませんでした。 –

+1

これを実行したとき、GlobalConfiguration.Configuration.Filters.Add(新しいElmahHandledErrorLoggerFilter())を追加しない限り、全く動作しませんでした。 RegisterGlobalFiltersメソッドで指定します。フィルタではありません。追加(新しいElmahHandledErrorLoggerFilter());ラインはそれをやった?両方を持つことのポイントは何ですか? – JustinP8

+0

@ JustinP8 WebApiは、既にMVCにあったものをほぼ完全に再現しています。これは、WebApiとMVCが異なるキャラクターであることがわかります.1つのUIは他のソフトウェアを指向しています。 GlobalConfiguration.Configuration.Filters(HttpFilterCollection)とGlobalFilters.Filters(GlobalFilterCollection)によって返される型をチェックアウトすると、それらが異なる獣であることがわかります。 – WooWaaBob

関連する問題