用OWIN中间件异常处理程序替换Web Api 2.2中的IExceptionHandler

时间:2015-07-31 10:38:20

标签: asp.net-web-api asp.net-web-api2 owin middleware

我创建了一个OWIN中间件来捕获异常。中间件没有做任何事情,但是使用像这样的try catch包装下一个调用

try {
  await _next(environment)
}
catch(Exception exception){
 // handle exception
}

问题是middlware没有捕获异常,因为异常是由IExceptionHandler的默认实现处理的,它返回带有堆栈跟踪的xml。

我知道我可以用我自己的实现替换默认的IExceptionHandler实现,但我想要的是OWIN中间件采取控制,这个默认的异常处理程序被忽略或替换为OWIN中间件

更新

我已将下面的答案标记为答案,虽然它更像是一个黑客攻击但我真的相信没有办法可以实现这一目标,因为WebApi异常永远不会被OWIN中间件捕获,因为Web API处理它自己的问题异常,而OWIN中间件处理在中间件中引发但未被这些中间件处理/捕获的异常

1 个答案:

答案 0 :(得分:3)

制作" ExceptionHandler:IExceptionHandler"比如in this answer。然后在HandleCore中,取出该异常并将其推入OwinContext:

public void HandleCore(ExceptionHandlerContext context)
{
    IOwinContext owinContext = context.Request.GetOwinContext();
    owinContext.Set("exception", context.Exception);
}

然后在中间件中,检查环境是否包含"异常"键。

public override async Task Invoke(IOwinContext context)
{
    await Next.Invoke(context);

    if(context.Environment.ContainsKey("exception")) {
        Exception ex = context.Environment["exception"];
        // Do stuff with the exception
    }
}