Asp.net web api 将Web Api 2.2中的IEExceptionHandler替换为OWIN中间件异常处理程序

Asp.net web api 将Web Api 2.2中的IEExceptionHandler替换为OWIN中间件异常处理程序,asp.net-web-api,asp.net-web-api2,owin,middleware,Asp.net Web Api,Asp.net Web Api2,Owin,Middleware,我创建了一个OWIN中间件来捕获异常。中间件实际上什么也不做,只是用try-catch这样包装下一个调用 try { await _next(environment) } catch(Exception exception){ // handle exception } 问题是middlware没有捕获异常,因为异常是由IEExceptionHandler的默认实现处理的,该实现返回一个带有堆栈跟踪的xml 我知道我可以用自己的IEExceptionHandler实现替换默认的IEExc

我创建了一个OWIN中间件来捕获异常。中间件实际上什么也不做,只是用try-catch这样包装下一个调用

try {
  await _next(environment)
}
catch(Exception exception){
 // handle exception
}
问题是middlware没有捕获异常,因为异常是由IEExceptionHandler的默认实现处理的,该实现返回一个带有堆栈跟踪的xml

我知道我可以用自己的IEExceptionHandler实现替换默认的IEExceptionHandler实现,但我想要的是让OWIN中间件控制并忽略此默认异常处理程序,或者用OWIN中间件替换它

更新:

我已经将下面的答案标记为一个答案,虽然它更像是一个黑客,但我真的相信,如果没有黑客,你是不可能做到这一点的,因为WebApi异常永远不会被OWIN中间件捕获,因为WebApi处理它自己的异常,而OWIN中间件处理在中间件中引发的异常,而不是其他被这些中间件处理/捕获

制作一个类似“ExceptionHandler:IEExceptionHandler”的文件。然后在HandleCore中,将该异常放入文本:

public void HandleCore(ExceptionHandlerContext context)
{
    IOwinContext owinContext = context.Request.GetOwinContext();
    owinContext.Set("exception", context.Exception);
}
然后在中间件中,检查环境是否包含“exception”键


以前尝试过:)但实际情况是,控件返回到与无限循环相同的HandleAsync方法,除非我做得不对,因为你说这种方法对你有效,将我的答案更改为对OWIN更有意义的方法,应该可以正常工作。整天尝试着这样做,我想这一定是你的情况更新中提到了这个问题,但答案在网上似乎也不多见。
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
    }
}