【问题标题】:Globally handle all exceptions in WebAPI 2 [closed]全局处理 WebAPI 2 中的所有异常 [关闭]
【发布时间】:2018-01-10 05:13:13
【问题描述】:

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

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

1。 API 异常

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

2。 Owin 管道异常

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

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

在 Global.asax 中创建自定义中间件异常或处理这样好吗?

3。除指定以外的任何其他例外情况

这里没有上面提到的任何其他例外。我不确切知道,这里是否有任何其他例外,但我只是在考虑这一点。如果是,我们需要如何处理?

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

请给您的 cmets 和更好的方法来处理所有这些异常。

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

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

【问题讨论】:

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


    【解决方案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 中处理登录时发生异常。

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

    而且selfhost 上也没有 global.asax,因此拥有GlobalExceptionMiddleware 的优势在于,如果您决定使用SelfHost 而不是 IIS,则所有异常都会得到处理。

    【讨论】:

    • 是的。好的,但是从 Application_Error 我们如何返回 HttpResponseMessage?
    • 你应该使用Response.WriteResponse.StatusCode
    • 好的,但我需要以 json 格式响应。有什么帮助吗?我会试试的
    • 你可以使用Response.Write(JsonConvert.SerializeObject(yourObject),你只需要自己序列化你的对象。
    • 太棒了。我想我现在很好。请发布相同的答案。唯一的疑问是我是否可以在 Application_Error 中处理将 owin 中间异常作为单独的异常创建的任何优势?
    猜你喜欢
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 2015-04-07
    • 2016-11-03
    • 1970-01-01
    相关资源
    最近更新 更多