2016-06-01 11 views
2

スタック内のすべての例外をキャプチャして適切に処理するoWinミドルウェアクラスを作成しようとしています。 Aグローバル例外ハンドラが呼び出されない

thisの記事に続いて、WebApiからMiddlewareスタックに例外を渡すためにIExceptionHandlerクラスを作成しました。

ただし、これは動作していないようです。 HandleCoreメソッドが呼び出され、info.Throw()がヒットしたにもかかわらず、例外はミドルウェアクラス内に表示されません。

exceptionHandlerの

public class WebApiExceptionPassthroughHandler : ExceptionHandler 
{ 
    public override Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken) 
    { 
     HandleCore(context); 

     return Task.FromResult(0); 
    } 

    public override void Handle(ExceptionHandlerContext context) 
    { 
     HandleCore(context); 
    } 

    private void HandleCore(ExceptionHandlerContext context) 
    { 
     //Pass webAPI Exceptions up the stack to the Logging Middleware - which will handle all exceptions. 
     if (!ShouldHandle(context)) return; 

     var info = ExceptionDispatchInfo.Capture(context.Exception); 
     info.Throw(); 
    } 

    public override bool ShouldHandle(ExceptionHandlerContext context) 
    { 
     return context.ExceptionContext.CatchBlock.IsTopLevel; 
    } 
} 

起動

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.Use<LoggingMiddleware>(); 

     GlobalConfiguration.Configure(WebApiConfig.Register); 
     app.UseWebApi(GlobalConfiguration.Configuration); 
    } 
} 

LoggingMiddleware

public class LoggingMiddleware : OwinMiddleware 
{ 
    public LoggingMiddleware(OwinMiddleware next) : base(next) 
    { 
    } 

    public override async Task Invoke(IOwinContext context) 
    { 


     //TODO: Initialise the log 
     try 
     { 
      await Next.Invoke(context); 
     } 
     catch (System.Exception ex) 
     { 
      //This is not getting reached. 
      var i = 1; 
     } 
    } 
} 

はwebapi.configの内部では、私は、このコマンドを持っている:

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

にはどうすればミドルウェアロギングクラスにバブルアップにWEBAPI例外を得るのですか?

答えて

1

あなたがOwinに移動しようとしている場合は、その悪いことを取り除くために、System.WebGlobalConfigurationを削除してください。 StartupにApiの設定を作成してみてください。

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.Use<LoggingMiddleware>(); 


     var config = new HttpConfiguration(); 
     //Move your WebApiConfig.Register here 
     config.Services.Replace(typeof(IExceptionHandler), new WebApiExceptionPassthroughHandler()) 

     //Finally use your newly created config here 
     app.UseWebApi(config); 
    } 
} 

希望します。

関連する問題