全局处理 WebAPI 2 中的所有异常

Globally handle all exceptions in WebAPI 2

我在 WebApi2 工作。我将实施全局异常处理。正如我们所知,我们可以使用 IExceptionHandlerIExceptionLogger 对于相同的。我也实现了同样的功能并且工作正常。

但是我对更多的场景有点困惑。所以我把我所有的场景分成 3 个部分

1。 API 例外情况

此处需要处理API范围内的所有异常。当然这里救场的是IExceptionHandlerIExceptionLogger接口。我们可以实现这个并且可以从处理程序发送自定义 HttpResponseMessage

2。 Owin 管道异常

这里是 owin 中间件中的所有异常,如令牌 api 和所有 Auth 提供程序级别的错误。

我还阅读了有关中间件的自定义异常。但在这里我需要明确的最佳实践建议。

在 Global.asax 中创建自定义中间件异常或处理是否好?

3。除指定

以外的任何其他例外

以上未提及的任何其他例外情况。我不太清楚,这里是否还有其他例外情况,但我只是在考虑。如果是,我们需要如何处理?

唯一的选项是 Global.asax Application_Error 事件。但是从这个我怎么能用我的自定义模型响应 HttpResponseMessage。

请提出您的意见和处理所有这些异常的更好方法。

Objective : 客户端在完整堆栈跟踪中没有收到任何 500 错误。将处理所有异常并仅将我的自定义消息发送到客户端

问题: 如何处理 owin 管道错误以及第 1 点中未处理的任何错误?

为了处理 Owin 管道异常,您可以编写自己的 ExceptionHandler 中间件并将其添加到 owin 管道的开头。你的中间件可以这样

public class GlobalExceptionMiddleware : OwinMiddleware
{
   public GlobalExceptionMiddleware(OwinMiddleware next) : base(next)
   {}

   public override async Task Invoke(IOwinContext context)
   {
      try
      {
          await Next.Invoke(context);
      }
      catch(Exception ex)
      {
          // your handling logic
      }
   }
}

并且您还应该在 Application_Error 中编写异常处理,以防您在 GlobalExceptionMiddleware 中处理登录时发生异常。

In global.asax in Application_Error 您可以使用 Response.Write(JsonConvert.SerializeObject(yourObject) 来 return 您的自定义错误。

而且 selfhost 上也没有 global.asax,所以使用 GlobalExceptionMiddleware 的好处是,如果您决定使用 SelfHost 而不是 IIS,所有的例外情况已处理。