WCF:客户端上的收集代理类型

我在wsdl中有以下类型(由第三方工具生成):

<xsd:complexType name="IntArray">
  <xsd:sequence>
    <xsd:element maxOccurs="unbounded" minOccurs="0" name="Elements" type="xsd:int" /> 
  </xsd:sequence>
</xsd:complexType>

有时Visual Studio会生成:

public class IntArray : System.Collections.Generic.List<int> {}

有时它不会为这个wsdl生成任何代理类型,只使用int [].

Web Service配置中的集合类型为System.Array.

什么可能是这样可预测的行为的原因?

编辑:

我找到了如何重现这种行为的方式.

例如,我们有两种类型:

<xsd:complexType name="IntArray">
  <xsd:sequence>
    <xsd:element maxOccurs="unbounded" minOccurs="0" name="Elements" type="xsd:int" /> 
  </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="StringArray">
  <xsd:sequence>
    <xsd:element maxOccurs="unbounded" minOccurs="0" name="Elements" type="xsd:string" /> 
  </xsd:sequence>
</xsd:complexType>

VS产生:

public class IntArray : System.Collections.Generic.List<int> {}

public class StringArray : System.Collections.Generic.List<string> {}

现在我改变StringArray类型:

<xsd:complexType name="StringArray">
  <xsd:sequence>
    <xsd:element maxOccurs="unbounded" minOccurs="0" name="Elements" type="xsd:string" /> 
    <xsd:any minOccurs="0" maxOccurs="unbounded" namespace="##any" processContents="lax" />
  </xsd:sequence>
  <xsd:anyAttribute namespace="##any" processContents="lax"/>
</xsd:complexType>

VS仅为StringArray生成代理类型.但不是IntArray.

编辑:

Reference.svcmap:

  <ClientOptions>
    <GenerateAsynchronousMethods>false</GenerateAsynchronousMethods>
    <EnableDataBinding>true</EnableDataBinding>
    <ExcludedTypes />
    <ImportXmlTypes>false</ImportXmlTypes>
    <GenerateInternalTypes>false</GenerateInternalTypes>
    <GenerateMessageContracts>false</GenerateMessageContracts>
    <NamespaceMappings />
    <CollectionMappings />
    <GenerateSerializableTypes>true</GenerateSerializableTypes>
    <Serializer>Auto</Serializer>
    <ReferenceAllAssemblies>true</ReferenceAllAssemblies>
    <ReferencedAssemblies />
    <ReferencedDataContractTypes />
    <ServiceContractMappings />
  </ClientOptions>
最佳答案
如果您查看项目的所有文件,然后查看名为Reference.svcmap的文件,以获取相应的服务参考,可以让我知道xml中的以下配置选项是什么?

<ExcludedTypes />
<ImportXmlTypes>false</ImportXmlTypes>
<GenerateInternalTypes>false</GenerateInternalTypes>
<GenerateSerializableTypes>false</GenerateSerializableTypes>
<Serializer>Auto</Serializer>

很抱歉把它放在一个答案中,但在评论中这是非常难读的.

编辑

好的,那么这里发生了什么呢?

>您正在使用auto作为序列化程序.
>默认值为DataContractSerializer
>当生成代理代码时,会检查禁止的xsd元素.
>如果发现禁止元素,则使用XmlSerializer.

在您的情况下,添加xsd:any元素会导致序列化模式更改.如果您想要一致的序列化,您将不得不删除禁止的元素或强制代理生成一直使用XmlSerialization.

Here是一个关于DataContractSerializer允许的架构元素的链接.

干杯
-Leigh

转载注明原文:WCF:客户端上的收集代理类型 - 代码日志