我的问题应该很简单,但不幸的是我没能解决它。
基本上,我有一些由 OWIN 托管并部署在 Azure 上的 Web API Controller 。
我确实需要跟踪每个中间件中发生的异常(例如OAuthAuthorizationServerProvider或SignalR持久连接),但我绝对不知道如何来实现它。
- 我尝试了 Elmah,但由于缺少 HttpContext,它似乎无法与 OWIN 正常工作。
- 我尝试使用 log4net,但只能使用自定义 ExceptionFilterAttribute 记录 Web API Controller 抛出的异常。其他异常将被忽略。
- 我尝试定义一个自定义 LoggerFactory 并在启动中分配它,使用
app.SetLoggerFactory(new MyLoggerFactory())
, 但其他中间件抛出的异常不会被记录。 - 我试图至少向客户端发送一条有意义的错误消息,但尽管
<customErrors mode="Off"/>
和<deployment retail="false"/>
,Azure 拒绝返回除{"message":"an error has occurred"}
之外的任何内容..我尝试了 Azure 网站和 Azure 云服务。 - 我看到一些应该与 OWIN 配合使用的云替代方案,例如 Elmah.io 或 Raygun.io,但我不需要它们的云功能,而且绝对不值得每年支付数百美元只是为了记录一些异常。
记录应用程序抛出的任何可能的异常的最佳方式应该是什么?
感谢您的帮助
最佳答案
您看过这个链接吗? http://www.asp.net/web-api/overview/error-handling/web-api-global-error-handling
由于无法使用异常过滤器捕获所有异常,因此他们建议使用 IExceptionLogger 和 IExceptionHandler 来允许在 Web Api 2 中进行全局错误处理。
之后,如果它不符合您的需要,您可以构建一个 OwinMiddleWare 并将其放置在第一个位置(在身份验证阶段之前),该中间件可以:
- 在响应 header 中创建 requestId
- 在发送响应之前分析响应代码,如果它不是 IsSuccessStatusCode,您可以将异常消息记录到数据库并替换响应的内容,以使用 requestId 向客户端发送简单的错误消息(以允许您可以在数据库中找到相关的异常)
希望这有帮助
关于azure - 如何使用 OWIN 正确记录每个异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27216262/