【问题标题】:Replace IExceptionHandler in Web Api 2.2 with OWIN middleware exception handler将 Web Api 2.2 中的 IExceptionHandler 替换为 OWIN 中间件异常处理程序
【发布时间】:2015-07-31 10:38:20
【问题描述】:

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

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

问题在于中间件没有捕获异常,因为异常是由 IExceptionHandler 的默认实现处理的,它返回一个带有堆栈跟踪的 xml。

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

更新:

我已将以下答案标记为答案,尽管它更像是一种 hack,但我真的相信没有 hack 就无法实现这一点,因为 WebApi 异常永远不会被 OWIN 中间件捕获,因为 Web API 自己处理异常,而 OWIN 中间件处理在中间件中引发但未被这些中间件处理/捕获的异常

【问题讨论】:

  • 一整天都在尝试这样做,但正如您在更新中提到的那样,这一定是这种情况,但网上的答案似乎也不多。

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


【解决方案1】:

制作一个“ExceptionHandler : IExceptionHandler”,如 in this answer。然后在 HandleCore 中,将该异常放入 OwinContext:

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

然后在您的中间件中,检查 Environment 是否包含“异常”键。

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
    }
}

【讨论】:

  • 之前尝试过 :) 但发生的情况是控件返回到相同的 HandleAsync 方法,如无限循环,除非我做错了,因为你说这种方法对你有用
  • 将我的答案更改为对 OWIN 更有意义并且应该可以正常工作的内容。
猜你喜欢
  • 2015-01-02
  • 2015-10-18
  • 1970-01-01
  • 2014-06-08
  • 2016-04-01
  • 2015-01-24
  • 1970-01-01
  • 2014-07-16
  • 1970-01-01
相关资源
最近更新 更多