【问题标题】:WCF: collection proxy type on clientWCF:客户端上的集合代理类型
【发布时间】:2010-03-04 05:29:45
【问题描述】:

我在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。

已编辑:

参考.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>

【问题讨论】:

  • 您能否详细说明您是如何生成客户端代理的?
  • 我正在使用 VS 2008“添加服务参考”:生成类的访问级别:公共;异步操作:未选中;始终生成消息合约:未选中;集合类型:System.Array;字典集合类型:System.Collections.Generic.Dictionary;在所有引用的程序集中重用类型:选中。

标签: wcf


【解决方案1】:

如果您查看项目的所有文件,然后查看名为 Reference.svcmap 的文件以获取相应的服务参考,您能否告诉我 xml 中的以下配置选项是什么?

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

很抱歉将其作为答案,但它在 cmets 中非常难以阅读。

编辑

好的,这里发生的事情如下:

  1. 您正在使用 auto 作为序列化程序。
  2. 默认为 DataContractSerializer
  3. 生成代理代码时,会检查禁止的 xsd 元素。
  4. 如果找到禁止元素,则使用 XmlSerializer。

在您的情况下,添加 xsd:any 元素会导致序列化模式发生变化。如果您想要一致的序列化,则必须删除禁止的元素或强制代理生成始终使用 XmlSerialization。

Here 是有关 DataContractSerializer 允许的架构元素的链接。

干杯 -利

【讨论】:

    【解决方案2】:

    据我所知,代理类是由SvcUtil.exe生成的,你为什么不用反射器看看呢……

    【讨论】:

    • VS 在生成代理时不使用 svcutil。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    相关资源
    最近更新 更多