1

我正在编写一个 WCF 客户端来与 JAX-WS Web 服务进行通信。基本上与服务的通信是有效的。但是在调查 WCF 客户端生成的 XML 时,缺少一些元素。所有属性均已正确生成,并且我已在代码中进行了设置。我一般是 WCF 和 Web 服务的新手,所以我很难分析这里可能出现的问题。什么可能导致 XML 中缺少元素?我注意到所有这些缺失属性的唯一共同点是它们都是枚举类型。但除此之外,我什么也没发现。例如,有一个国家代码的枚举。一个实体具有该枚举类型的 3 个属性。在 XML 中仅生成 3 个相关元素中的一个。

谢谢你的帮助。

4

2 回答 2

2

正如 OP 所发现的,当 WCF 客户端(包括XSD.exe实用程序生成的代理类)从 WSDL 或 XSD 导入枚举器时,代理也具有相应的bool属性。对于名为“Foobar”的枚举元素,还必须设置“FoobarSpecified”,true否则 WCF 将不会序列化数据元素。

在提出问题 6 年后仍然如此,即使在 .NET Core 和 Visual Studio 2017 中使用新的 WCF 客户端,也不是特别明显,所以我想我会宣传 OP 对 wiki 答案的评论响应.

于 2018-08-13T12:48:28.220 回答
1

这很可能发生,因为 WCF 合同对枚举的处理方式不同。对于数据协定,您用属性标记类,用DataContract属性标记成员DataMember。不太为人所知的是,枚举有自己的属性EnumMember,称为 WCF 用来正确序列化它们的属性。

有一篇名为Enumeration Types in Data Contracts的 MSDN 文章更详细地介绍了用法。文章中的示例代码显示了带有枚举的合约的外观:

[DataContract]
public class Car
{
    [DataMember]
    public string model;
    [DataMember]
    public CarConditionEnum condition;
}

[DataContract(Name = "CarCondition")]
public enum CarConditionEnum
{
    [EnumMember]
    New,
    [EnumMember]
    Used,
    [EnumMember]
    Rental,
    Broken,
    Stolen
}

请注意,在他们的示例中(我在上面已经包含),如果需要,您可以将枚举值的子集设置为数据协定的一部分。

除此之外,任何未使用该属性标记的DataMember属性都不会通过网络进行序列化。这应该是确保序列化适用于 WCF 的清单:

  1. 检查类是否标有该DataContract属性。
  2. 检查属性是否标记有该DataMember属性。
  3. 检查各个枚举值是否标有该EnumMember属性。
于 2012-10-25T15:14:40.963 回答