WCF客户端生成的XML缺少某些元素

时间:2012-10-25 14:56:54

标签: wcf soap xml-serialization jax-ws

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

感谢您的帮助。

2 个答案:

答案 0 :(得分: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属性。

答案 1 :(得分:0)

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

问了问题6年后仍然如此,即使在.NET Core和Visual Studio 2017中使用新的WCF客户端时,它也不是很明显,所以我认为我会提倡OP的评论响应到维基答案。