【问题标题】:XML generated by WCF client is missing some elementsWCF 客户端生成的 XML 缺少某些元素
【发布时间】:2012-10-15 19:15:43
【问题描述】:

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

感谢您的帮助。

【问题讨论】:

    标签: wcf soap xml-serialization jax-ws


    【解决方案1】:

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

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

    【讨论】:

    • 先生,您救了我们的命。
    【解决方案2】:

    这很可能发生,因为 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 属性。

    【讨论】:

    • 感谢您的帮助。我自动生成了代理和数据类,所以 WCF 不应该处理这个吗?但是,我手动编辑了 Reference.cs 并添加了您建议的属性,但没有任何改变。
    • 您创建的 WCF 端点或与外部 JAX-WS Web 服务的连接是否有错误?如果它是 JAX-WS Web 服务,您能否在 WCF 之外将枚举发送给它?
    • 我找到了解决方案。如果您为它们分配了值,则必须设置一些具有相关属性的属性。例如,可能有一个元素 Foobar 和另一个 IsFoobarSet。只有当 IsFoobarSet = true 时,才会创建 Foobar 元素。不要问我为什么要这样实现。对我来说似乎很不寻常,但我对这些东西很陌生,所以这可能有一个超级合乎逻辑的原因。
    猜你喜欢
    • 1970-01-01
    • 2021-02-10
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    相关资源
    最近更新 更多