我正在编写一个WCF客户端来与JAX-WS Web服务进行通信。基本上与服务沟通工作。但是在调查WCF客户端生成的XML时,缺少一些元素。所有属性都已正确生成,我已在我的代码中设置它们。我是WCF和Web服务的新手,所以我有问题来分析这里可能出错的地方。什么可能导致XML中缺少的元素?我注意到所有这些缺失属性的唯一共同点是它们是枚举类型。但除此之外我什么都没发现。例如,有一个国家代码的枚举。权利具有该枚举类型的3个属性。在XML中仅生成3个相关元素中的一个。
感谢您的帮助。
答案 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的清单:
DataContract
属性。DataMember
属性。EnumMember
属性。答案 1 :(得分:0)
正如OP所发现的,当WCF客户端(包括由XSD.exe
实用程序生成的代理类)从WSDL或XSD导入枚举器时,代理也具有相应的bool
属性。对于名为“ Foobar”的枚举元素,还有一个“ FoobarSpecified”,必须将其设置为true
,否则WCF不会序列化数据元素。
问了问题6年后仍然如此,即使在.NET Core和Visual Studio 2017中使用新的WCF客户端时,它也不是很明显,所以我认为我会提倡OP的评论响应到维基答案。