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

Men*_*eah 18 logging middleware exception-handling azure owin

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

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

我真的需要追踪每个中间件中出现的异常(例如OAuthAuthorizationServerProviderSignalR Persistent Connections),但我绝对不知道如何实现它.

  • 我尝试过Elmah,但由于缺少HttpContext,它似乎与OWIN无法正常工作.
  • 我尝试使用log4net,但我只能使用自定义的ExceptionFilterAttribute记录Web API控制器抛出的异常.其他的被忽略.
  • 我尝试定义一个自定义LoggerFactory并在Startup中使用它来分配它app.SetLoggerFactory(new MyLoggerFactory()),但是不会记录其他中间件抛出的异常.
  • 我试图让至少向客户端发送一个有意义的错误消息,但尽管<customErrors mode="Off"/><deployment retail="false"/>,天青拒不归还任何东西,但{"message":"an error has occurred"}..我都尝试Azure网站和Azure的云服务.
  • 我看到一些云替代品与OWIN工作,像Elmah.io或Raygun.io,但我不需要他们的云功能,它肯定是不值得付出数百美元,每年只需登录一些例外.

记录我的应用程序引发的任何可能异常的最佳方法是什么

谢谢你的帮助

Jer*_*ard 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向客户端发送简单的错误消息(以允许您查找您的数据库中的相关异常)

希望这个帮助

  • 非常感谢,Jeremie.这就是诀窍.具体来说,使用IExceptionHandler不足以捕获所有中间件(包括OAuth)的异常.但定义一个新的中间件,并处理其中的异常,解决了我的问题:记录它们并决定将什么转发给客户端.再次感谢!:) (2认同)