我们有几百个通过ADO.NET调用存储过程的WCF服务。我们希望客户端能够更智能地处理服务器异常。我使用具有自定义错误类型的通用FaultException工作代码,但我想只要我在这里,我想尝试抛出非泛型FaultException,并将所有额外信息放在其Data集合中。
但我无法做到这一点。 FaultException是在服务器上创建的,我抛出它,但是有人正在捕获它并抛出一个带有标准Data值的新FaultException:“MethodName”,参数,“AsyncActionDescription”。所以我要么做错了,要么你做不到。
我很难找到相关的文档。一切都是关于使用通用的FaultException< T>。仅仅因为这个原因,我认为我只会坚持使用通用,特别是因为我已经有了它。因为强烈的类型,有人无疑会正确地提醒我。
我只是好奇这里发生了什么。
答案 0 :(得分:1)
通过找不到答案,您在此看到的是WCF强烈强制分离对服务故障的担忧。基本问题是“客户如何知道该怎么做?”从客户端角度来看,它是S_OK或!S_OK从COM中解释HRESULT。
不向客户提供特定故障背后的想法实际上是客户端对该问题的了解要少得多。最重要的是,客户更不愿意理解如何补偿服务失败。例外情况有时非常特定于技术,这会引入客户端和服务之间的耦合形式。
您可以使用Fault Contracts与客户进行通信。 FaultException<T>
可以帮助将特定异常转换为错误。
我建议你阅读WCF bible book from Juval。第6章充满了关于故障的良好信息。
还有IncludeExceptionDetailsInFaults服务行为。适合调试,但不要在生产中使用它。
[ServiceBehavior(IncludeExceptionDetailsInFaults = true)]
class MyService : IMyContract
{...}