【发布时间】:2013-01-02 12:40:28
【问题描述】:
在我们的应用程序中,我们有一组相当简单的日志记录钩子(MVC 和 API 控制器上的 IExceptionFilters 以及 Application_Error() 中的一个额外的包罗万象),但是有一整类错误不会触发任何错误.如果从 WebAPI 本身或内部使用的东西(例如由依赖解析器创建的类的类型初始化程序)抛出异常,我得到的只是发送到客户端的 500 响应。
我发现捕获错误详细信息的唯一方法是使用 HttpConfiguration.IncludeErrorDetailPolicy 配置应用程序以发出错误详细信息 - 但是,将错误详细信息广播到全世界是一种明显的不良做法,所以我会更喜欢完全关闭它,或者将其设置为有条件的(例如,仅限本地。)..但这意味着远程进入运行应用程序的服务器并使用可以检查响应的工具在本地调用 API(比如IE 或谷歌浏览器),以便弄清楚发生了什么。
我在这里看到了另一个类似的问题 (here),但是提出的解决方案(使用 DelegatingHandler 来检查响应)不能满足我们的需求,我们认为。真的没有我可以挂钩的事件、我可以使用的扩展点或类似的东西来捕获发生的实际异常吗?
(顺便说一句,我想我可以将我的 IncludeErrorDetailPolicy 更改为 Always 并使用其他线程中提供的解决方案来捕获 MessageHandler 中的错误详细信息,记录它们,并从发送给客户端的响应中手动清除它们,但那将是一个令人讨厌的黑客攻击。)
想法? :/
【问题讨论】:
-
为什么 MessageHandler 方法不适合你?
-
我可能会误解它,但从我阅读它的方式来看,获取我可以记录的异常对象的唯一方法是遵循我的问题末尾提到的黑客 - 到启用在所有响应中包含错误详细信息,然后在错误中解析该错误详细信息以尝试重建最初引发的异常,然后在将响应发送到客户端之前手动清除响应中的这些详细信息。 ..虽然这应该可行,但它听起来很粗糙、脆弱,并且容易丢失诊断信息和/或无意中将这些信息泄露给客户。
-
您想保留诊断信息并避免将信息泄露给客户端吗?你想发回什么样的回复?为什么默认设置对您不起作用?出于调试目的,您将在本地计算机上获得完整的诊断信息,并且不会向远程客户端泄露任何信息。
-
嗯,是的 - 我的目的是在服务器上捕获尽可能多的信息,并将最小的响应发送到客户端。问题是,对于大多数错误,我们使用框架中的内置机制来捕获日志记录的错误详细信息(MVC 和 HTTP IExceptionFilters 以及 Application_Error 事件),这一切都很好,但似乎有一个类别Web api 内部和周围的错误,其中不存在这种机制 - 或者,至少,我找不到。
标签: logging error-handling asp.net-web-api