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例外を得るのですか?