【问题标题】:WCF proxy client generated with wsdl not matching for ServiceContract, XmlSerializerFormat attributes使用 wsdl 生成的 WCF 代理客户端与 ServiceContract、XmlSerializerFormat 属性不匹配
【发布时间】:2009-11-11 16:26:30
【问题描述】:



我正在 .net 3.5 框架中开发 WCF 服务,并将它们托管在带有 basicHttpBiding 的 IIS 5.1 windows xp sp3 中。

服务消费客户端在 . NET 2.0 框架。为此,我使用 WSDL.EXE 生成了代理客户端。这个工具生成代理类没有任何问题,但是它为每个属性添加的问题添加了额外的属性“[property]Specified”,但是工作正常没有任何问题,只需要指定”为任何属性赋值时指定 = true"

为了删除这个额外的属性,我添加了 XmlSerializerFormat 属性和 ServiceContract 属性。 WSDL.EXE 生成的类没有额外的属性,但它排除了一些以前包含的类

是否需要设置任何属性才能生成排除的类?

注意:所有合约类都使用 DataContract 属性,属性使用 DataMemeber


nRk

【问题讨论】:

    标签: wcf wcf-client


    【解决方案1】:

    XmlSerializer 使用 XmlIncludeAttribute 而不是 KnownTypeAttribute 来发现未包含在操作协定中的子类型。所以你可以尝试将它们添加到基类中:

    [XmlInclude(typeof(ChildClass1))]
    [XmlInclude(typeof(ChildClass2))]
    public class BaseClass {}
    

    【讨论】:

      【解决方案2】:

      标准 WCF DataContractSerializer 将序列化所有标有 [DataMember] 的内容 - 无论 .NET 可见性如何(公共/受保护/私有/内部)。

      当您切换到 XmlSerializerFormat 时,行为会发生变化 - 现在 XmlSerializer 将序列化所有具有 public 可见性并且没有标记 [XmlIgnore] 的内容。

      我会假设你的一些类和成员没有用public 标记,因此不再被序列化。 XmlSerializer 还要求类有一个显式的、无参数的构造函数,该构造函数将用于反序列化 - 你所有的类都有吗?当然,这个构造函数也需要是public

      【讨论】:

      • 感谢 Marc,正如您所指定的,所有属性都具有公共属性并具有默认构造函数。问题来了,我需要返回一个方法是基类,它由 8 个子类继承,但我只获得 4 个代理类。所有继承的类都是公共/默认构造函数,所有属性都是公共的。所有使用 DataContract 装饰的类和使用 DataMember 属性的属性。
      • 如果您使用的是 XmlSerializer,则 DataContract/DataMember 属性在这里无关紧要。您的所有 8 个子类是否都在操作合同的 [KnownType] 属性中定义?我认为只有那些作为操作中的参数或通过 known-type 属性特别提到的那些才会被序列化
      • 感谢您的帮助。对不起,我忘了说,在基类中我添加了属性[KnownType(typeof(childclass))],我为每个子类添加了8个属性。
      猜你喜欢
      • 2010-10-13
      • 1970-01-01
      • 2012-10-16
      • 1970-01-01
      • 2020-12-02
      • 1970-01-01
      • 2019-01-23
      • 1970-01-01
      • 2011-03-23
      相关资源
      最近更新 更多