gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:06:35 25 4
gpt4 key购买 nike

我在 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 服务配置中的集合类型是 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>

最佳答案

如果您查看项目的所有文件,然后查看名为 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 允许的架构元素的链接。

    干杯
    -利

    关于WCF:客户端上的集合代理类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2377088/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com