【发布时间】:2016-06-01 09:48:12
【问题描述】:
我正在尝试创建一个 oWin 中间件类,该类将捕获堆栈中的所有异常,并适当地处理它们。一个
在this 文章之后,我创建了一个IExceptionHandler 类来将异常从WebApi 向上传递到中间件堆栈。
但是,这似乎不起作用。尽管调用了HandleCore 方法,并命中了info.Throw(),但中间件类中从未出现异常。
异常处理程序
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);
}
}
日志中间件
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 异常冒泡到中间件日志记录类?
【问题讨论】:
标签: c# exception-handling asp.net-web-api2 owin