【发布时间】: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