【发布时间】:2010-12-16 13:34:08
【问题描述】:
我有很多遗留代码现在是 WCF REST 服务的后端 - 如果这很重要的话,它以前曾经是普通的 WCF 服务后端。我想实现一种机制,可以捕获任何方法中的任何异常并对其进行分析。如果结果是已知错误,则会被处理并变成一个友好的错误。
我知道我可以抛出 FaultException 或 WebProtocolException 而不是“通常”的异常,但是有很多地方会在整个代码中抛出异常,并且查找所有异常是一个非常痛苦的选择。
我尝试添加一个端点行为扩展来创建一个新的行为,该行为覆盖标准WebHttpBehavior.AddServerErrorHandlers 方法并将我的错误处理程序(IErrorHandler 实现)添加到端点调度程序错误处理程序集合中。在错误处理程序中,我分析异常并基于此异常创建(或不创建)所需的故障。
我希望这种机制能够为任何已知异常返回自定义数据,但我错了。老微软已经实现了一个美妙的不可避免的WebHttpBehavior2,它无条件地将一个内部Microsoft.ServiceModel.Web.WebErrorHandler 添加到端点调度程序错误处理程序集合的末尾。此处理程序忽略所有先前执行的处理程序,只识别一小部分异常,而大多数异常被解释为“内部服务器错误”,仅此而已。
问题是我是否走在正确的道路上,是否有办法在 WCF REST 机制中禁用此处理程序,或者使用新异常引入它(例如,当任何异常被捕获时,它首先由我的处理程序处理如果它们抛出/返回,例如,FaultException,那么这个新异常将提供给Microsoft.ServiceModel.Web.WebErrorHandler,而不是原来的)。如果我对IErrorHandler 和行为扩展的所有实验都毫无价值,那么还有什么替代方案?再说一次,我真的不想修改异常抛出逻辑,我想要一个地方来捕获异常并处理它们。
非常感谢!
【问题讨论】: