如何使用OWIN正确记录每个异常

时间:2014-11-30 17:50:09

标签: azure logging exception-handling owin middleware

我的问题应该很简单,但不幸的是我没有解决它的运气。

基本上,我有一些由OWIN托管并部署在Azure上的Web API控制器。

我真的需要追踪每个中间件中发生的异常(例如 OAuthAuthorizationServerProvider SignalR Persistent Connections ),但我绝对不知道如何实现它。

  • 我试过Elmah,但由于缺少 HttpContext ,它似乎与OWIN无法正常工作。
  • 我尝试使用log4net,但我只能使用自定义的ExceptionFilterAttribute记录Web API控制器抛出的异常。其他的被忽略。
  • 我尝试使用app.SetLoggerFactory(new MyLoggerFactory())定义自定义LoggerFactory并在Startup中分配它, 但是没有记录其他中间件抛出的异常。
  • 我尝试至少发送一条有意义的错误消息发送到客户端,但是尽管<customErrors mode="Off"/><deployment retail="false"/>,Azure拒绝返回除{"message":"an error has occurred"}之外的任何内容。我尝试了两个Azure Web站点和Azure云服务。
  • 我看到应该与OWIN合作的一些云替代品,如Elmah.io或Raygun.io,但我不需要他们的云功能,绝对不值得支付数百美元每年只记录一些例外情况。

应用程序抛出记录任何可能的异常的最佳方法是什么?

感谢您的帮助

1 个答案:

答案 0 :(得分:12)

你看看这个链接了吗? http://www.asp.net/web-api/overview/error-handling/web-api-global-error-handling

因为你无法使用exceptionFilter捕获所有异常,所以他们建议使用IExceptionLogger和IExceptionHandler来允许Web Api 2中的全局错误处理。

之后,如果它不符合您的需要,您可以构建一个OwinMiddleWare,您将放置在第一个位置(在Authenticate阶段之前),这个中间件可以:

  1. 在回复标题中创建一个requestId
  2. 在发送响应之前分析响应代码,如果它不是IsSuccessStatusCode,您可以将异常消息记录到DB并替换响应的内容以使用requestId向客户端发送简单的错误消息(允许你可以在你的数据库中找到相关的例外)
  3. 希望这个帮助