在我们的应用程序中,我们有一组相当简单的日志记录钩子(Hook)(MVC 和 API Controller 上的 IExceptionFilters 和 Application_Error() 中的一个额外的 catch-all),但是有一整类错误不会触发任何一个。如果从 WebAPI 本身或内部使用的某些东西(例如由依赖解析器创建的类的类型初始化程序)抛出异常,我得到的只是一个 500 响应被发送到客户端。
我发现捕获错误详细信息的唯一方法是使用 HttpConfiguration.IncludeErrorDetailPolicy 来配置应用程序以发出错误详细信息 - 但是,将错误详细信息广播到世界是一种明显的不良做法,所以我宁愿转这完全关闭,或将其设置为有条件的(例如,仅限本地。)..但这意味着远程进入运行应用程序的服务器并使用可以检查响应的工具(如 IE 或 Google)在本地调用 API Chrome),以便弄清楚发生了什么。
我在这里看到了另一个类似的问题( here ),但是我们认为,提出的解决方案(使用 DelegatingHandler 来检查响应)不能满足我们的需求。真的没有我可以 Hook 的事件、我可以使用的扩展点或类似的东西来捕获发生的实际异常吗?
(顺便说一句,我想我可以将我的 IncludeErrorDetailPolicy 更改为 Always 并使用另一个线程中提供的解决方案来捕获 MessageHandler 中的错误详细信息,记录它们,并从发送给客户端的响应中手动清除它们,但是将是一个讨厌的黑客。)
想法? :/
最佳答案
我们向 Microsoft 合作伙伴网络提出了支持请求,他们返回了我认为更好的答案。
这个想法是用一个将默认 Controller 创建行为与任何其他所需行为包装起来的实现替换平台的默认 IHttpControllerActivator 实现。
在我们的例子中,这意味着使用 try/catch/throw 结构和对我们的日志服务的调用来包装 DefaultHttpControllerActivator 的 Create 方法。这可能无法提供 100% 的覆盖率,但我们遗漏的大多数异常(exception)都与 Controller 的创建有关,因此它应该会有很大帮助。
我真的很想能够在 HttpControllerDispatcher 中 Hook HandleException 方法,但它既是私有(private)的又是静态的,所以嗯。
关于logging - 应该如何处理内部 web api 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14405102/