我想将异常处理连接到一个中间件组件中,如下所示:
public override async Task Invoke(IOwinContext context)
{
try
{
await Next.Invoke(context);
}
catch (Exception ex)
{
// Log error and return 500 response
}
}
然而,我想捕获的一些异常在我能够访问它们之前被Web API管道捕获并转换为HttpErrorResponse
.在这个过程中,我丢失了很多关于错误的细节,因此在调试时,我无法获得有用的堆栈跟踪等(当抛出异常时,调试器甚至不会停止——我必须手动逐步判断代码,看看它在哪里失败……).
我try 使用以下实现添加自定义异常处理程序:
public Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken)
{
var owinContext = context.Request.GetOwinContext();
owinContext.Set(Constants.ContextKeys.Exception, context.Exception);
return Task.FromResult(0);
}
在我的启动配置中注册到config.Services.Replace(typeof(IExceptionHandler), new MyExceptionHandler());
,但在执行Next.Invoke(context)
到
context.Get<Exception>(Constants.ContextKeys.Exception);
still并没有给出我想要的所有细节,也没有在调试程序出现故障时停止.
有没有一种方法可以关闭all内置的错误处理,这样我自己的中间件就可以处理它?
Clarification,因为很多人似乎误解了我想要的是什么:
- Web API中的内置错误处理捕获some个(但不是全部)异常,并将它们重写为500个响应.
- 我想捕获all个异常,做一些日志(log)记录,then发出500个响应with the information I choose(对于大多数异常,请参阅下一个项目).
- 还有一些发出业务逻辑错误信号的异常,对于这些异常,我希望返回40x错误.
- 我希望它处于(应用程序)管道的顶端,即在请求生命周期中包装everything个其他应用程序
- 我想使用OWIN来处理这个问题,使其可移植到future 可能的自托管场景中(也就是说,这个应用程序始终托管在IIS上并非一成不变——HTTP模块、Global.asax.cs等在这里不相关).