当在控制器中抛出某些异常时,我想捕获这些异常并做一些额外的逻辑。
我能够通过添加到全局过滤器列表的自定义IExceptionFilter来实现此目的。
但是,我希望在自定义Owin中间件中处理这些异常。 我的中间件看起来像这样:
try
{
await Next.Invoke(context);
}
catch (AdalSilentTokenAcquisitionException e)
{
//custom logic
}
这段代码不起作用,看起来异常已经在MVC中被捕获和处理了。 有没有办法从MVC跳过异常处理,让中间件捕获异常?
答案 0 :(得分:4)
更新:我找到了更清洁的方法,请参阅下面的更新代码。 使用这种方法,您不需要自定义的异常过滤器,最重要的是,您不需要在Owin中间件中使用HttpContext环境服务定位器模式。
我在MVC中有一个工作方法,然而,不知怎的,它感觉不舒服,所以我会很感激别人的意见。
首先,确保MVC的GlobalFilters中没有添加异常处理程序。
将此方法添加到全局asax:
protected void Application_Error(object sender, EventArgs e)
{
var lastException = Server.GetLastError();
if (lastException != null)
{
HttpContext.Current.GetOwinContext().Set("lastException", lastException);
}
}
重新抛出异常的中间件
public class RethrowExceptionsMiddleware : OwinMiddleware
{
public RethrowExceptionsMiddleware(OwinMiddleware next) : base(next)
{
}
public override async Task Invoke(IOwinContext context)
{
await Next.Invoke(context);
var exception = context.Get<Exception>("lastException");
if (exception != null)
{
var info = ExceptionDispatchInfo.Capture(exception);
info.Throw();
}
}
}
答案 1 :(得分:2)
没有完美的方法(我知道),但您可以将默认的IExceptionHandler
替换为只将错误传递给其他人的tomcat
堆栈。
关于这一点,我做了some extensive digging,现在似乎没有更好的方法。