2017-01-05 3 views
1

ステートレスWeb APIのコントローラメソッドに対してグローバル例外処理をどのように処理する必要がありますか?私の目標は、コントローラ内のtry/catchステートメントの冗長さを避けることです。サービスファブリックのグローバルエラー処理ステートレスWeb API

私はWebAPIConfig.csに登録したカスタムExceptionHandlerを使用して、IISがホストするWeb APIでこれを実現できました。これは、OWINでホストされているAPI(Service Fabricなど)で正しく機能しません。 SFステートレスWeb APIでは、私はOwinミドルウェアを作成し、そのミドルウェアをStartup.csに登録しましたが、動作しません。 catchブロックは、ミドルウェアコードの応答パイプラインでは無視されます。そこに似たquestonsのかなり多くがあったので、

...解決策を掘るたくさんの後

public override async Task Invoke(IOwinContext context) 
{ 
    try 
    { 
     //It goes here 
     await Next.Invoke(context); 
    } 
    catch (Exception ex) 
    { 
     //This catch block does not get called???? 
     HandleException(ex, context); 
    } 
} 
+0

あなたは**カスタムの 'ExceptionLogger/Handler'を使うことができます(自己ホスト型でもIISでもホスト型ではありません) –

答えて

0

は、私は、Web APIとOWINパイプラインについての理解を得ました。 Disable *all* exception handling in ASP.NET Web API 2 (to make room for my own)? ファースト・オフのWeb API例外は、デフォルトで処理されるため、例外が処理されてスタック・トレースに伝播しないことを意味します。そして、それが上記のキャッチブロック(投稿された質問から)が呼び出されない理由です。それが呼び出されるようにするために、私はこれを経由して(startup.cs中)のWeb APIのIExceptionハンドラを交換する必要があります。

config.Services.Replace(typeof(IExceptionHandler), new PassthroughExceptionHandler()); 

ハンドラが行うすべてこのカスタムが前方スタックダウン例外であり、OWINグローバルをしましょう例外ミドルウェアは作業を行います。これはExceptionDispatchInfoを使用していることを

public class PassthroughExceptionHandler : IExceptionHandler 
{ 
    public Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken) 
    { 
     var info = ExceptionDispatchInfo.Capture(context.Exception); 
     info.Throw(); 
    } 
} 

注:

PassthroughExceptionHandlerは、次のように実装されています。実装が異なる他のソリューションもありますが、これまでのところ、私の必要としていたのは、私の共通エラー応答モデルである例外的に私のOwinGlobalExceptionHandlerに例外を包み込むことです。

関連する問題