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

时间:2018-01-10 05:13:13

标签: c# exception-handling asp.net-web-api2 owin-middleware

我在WebApi2工作。我将实现全局异常处理。正如我们所知,我们可以使用 IExceptionHandler IExceptionLogger 。我也实现了相同和工作正常。

但是我对一些更多场景感到困惑。所以我将所有场景分成3部分

1。 API例外

这里需要处理API范围内的所有异常。当然,这里的救援是 IExceptionHandler IExceptionLogger 接口。我们可以实现这个,并可以从处理程序

发送自定义HttpResponseMessage

2。 Owin管道例外

此处owin中间件中的所有异常,例如token api和所有Auth提供程序级错误。

我也读过关于中间件的自定义异常。但在这里,我需要明确的最佳实践建议。

在Global.asax中创建自定义中间件例外或处理是否合适?

3。除指定的

之外的任何其他例外

此处未提及任何其他例外情况。我不确切地知道,这里有任何其他例外,但我只是想着这个。如果是,我们需要处理什么?

只有选项是Global.asax Application_Error事件。但是从这个方面我怎么能用我的自定义模型作为HttpResponseMessage响应。

请提供您的意见和更好的方法来处理所有这些例外情况。

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

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

1 个答案:

答案 0 :(得分:0)

对于处理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
      }
   }
}

如果您在GlobalExceptionMiddleware中处理登录时发生异常,也应该在Application_Error中编写异常处理。

在Application_Error的global.asax中,您可以使用Response.Write(JsonConvert.SerializeObject(yourObject)返回自定义错误。

selfhost上也没有global.asax,所以拥有GlobalExceptionMiddleware的好处是,如果您决定使用SelfHost而不是IIS,那么所有例外处理完毕。