【问题标题】:How to make a WCF service return a NON-generic FaultException with additional Data如何使 WCF 服务返回带有附加数据的非泛型 FaultException
【发布时间】:2013-05-31 15:26:53
【问题描述】:

我们有几百个 WCF 服务,它们通过 ADO.NET 调用存储过程。我们希望客户端更智能地处理服务器异常。我有使用具有自定义故障类型的通用 FaultException 的工作代码,但我想只要我在这里,我想尝试抛出非通用 FaultException,并将所有额外信息放入其数据集合中。

但我做不到。 FaultException 是按照我的意愿在服务器上创建的,我将其抛出,但有人捕捉到它并抛出一个具有标准数据值的新 FaultException:“MethodName”、“参数”、“AsyncActionDescription”。所以我要么做错了,要么你不能那样做。

我很难找到这方面的文档。一切都是关于使用泛型 FaultException。仅出于这个原因,我想我会坚持使用泛型,特别是因为我已经让它工作了。而且因为 STRONGLY TYPED 无疑有人会正确地提醒我。

我只是好奇这里发生了什么。

【问题讨论】:

  • 为什么你认为(或似乎基于你的第三段)FaultException<T> 不是强类型的?
  • @Tim 你倒读了我。我认为 FaultExceptionmore “强类型”,而不是普通的非泛型 FaultException,它的 Data 成员中添加了一些任意条目。我说我应该使用 FaultException因为“强类型”。更不用说,我已经开始工作了。
  • 哎呀....对不起。感谢您的澄清。
  • 没有问题!感谢您的光临。

标签: .net wcf soap fault


【解决方案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
{...}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多