1

当我使用 DataContact/DataMember 属性公开 WCF 服务时,我在其他项目中对该服务所做的每个服务引用都会生成具有 DataContract/DataMember 属性的类(以及 IExtensibleDataObject 接口实现等)。

在另一个项目中,我必须使用一个 SOAP 服务,其 WSDL 不是由 WCF 生成的,而是由其他一些我不知道且无法更改行为的工具生成的。

我的问题是我的 svcutil 代理生成的代码不太灵活:

  • 这些类使用 Serializable 属性而不是 DataContract(GeneratedCode 属性指定使用 System.Xml 而不是 System.Runtime.Serialization)
  • IExtensibleDataObject 未实现
  • 不使用 OptionalField 属性
  • XmlElement 的顺序是固定的,当新的 xs:element 插入到 wsdl xs:sequence 的中间时,会导致反序列化失败...

我使用的 svcutil 工具/wsdl 中发生了什么,它必须以这种方式生成代码?

4

1 回答 1

1

我使用的 svcutil 工具/wsdl 中发生了什么,它必须以这种方式生成代码?

Svcutil.exe 工具可用于为 WCF 和 ASMX 服务创建客户端代理。当使用 Svcutil.exe 从 ASMX 服务创建代理时,代码中生成的数据类型通常使用 XML 序列化。

http://msdn.microsoft.com/en-us/library/cc304837.aspx

更新:

我最好的猜测是 WSDL 中指定的模式决定了 svcutil.exe 必须使用哪个序列化。

数据契约序列化模式的命名空间是http://schemas.microsoft.com/2003/10/Serialization,您可以在此处获得更多详细信息。

因此,如果 svcutil 看到 wsdl 中指定的此模式,那么它会使用数据合同序列化程序,否则使用 xml 序列化程序。

我还检查了 WCF 和 ASMX 的 WSDL。WCF 服务的 WSDL 包含以下 XSD 部分,它们在 ASMX 的部分中缺失。

<xsd:schema targetNamespace="http://tempuri.org/Imports">

   <xsd:import schemaLocation="http://localhost:53328/Service1.svc?xsd=xsd0"
     namespace="http://tempuri.org/"/>

   <xsd:import schemaLocation="http://localhost:53328/Service1.svc?xsd=xsd1" 
     namespace="http://schemas.microsoft.com/2003/10/Serialization/"/>

   <xsd:import schemaLocation="http://localhost:53328/Service1.svc?xsd=xsd2" 
      namespace="http://schemas.datacontract.org/2004/07/WcfService1"/>
</xsd:schema>
于 2012-06-14T14:41:57.683 回答