【问题标题】:.NET auto-generated WSDL client does not handle abstract type when maxOccurs attribute is used.NET 自动生成的 WSDL 客户端在使用 maxOccurs 属性时不处理抽象类型
【发布时间】:2013-04-04 19:11:15
【问题描述】:

我有一个相当复杂的 WSDL,我将其添加为 Visual Studio 中的服务引用。我遇到的问题是自动生成的客户端代码没有正确处理抽象类型(并忽略了所有替代该抽象类型的类型)。我不想发布整个 WSDL,但这里有一个 sn-p:

<complexType name="AddTextFields">
    <complexContent>
        <extension base="ti:TransformationInstructions">
            <sequence>
                <element name="textFieldList"
                    type="atf:TextFieldList" />
            </sequence>
        </extension>
    </complexContent>
</complexType>

<complexType name="TextFieldList">
    <sequence>
        <element ref="atf:TextFieldBase"
            maxOccurs="unbounded" />
    </sequence>
</complexType>

<element name="TextFieldBase" abstract="true"/>

<element name="textField" substitutionGroup="atf:TextFieldBase">
  <complexType>
    <sequence>
      ...
    </sequence>
  </complexType>
</element>

<element name="checkBox" substitutionGroup="atf:TextFieldBase">
  <complexType>
    <sequence>
      ...
    </sequence>
  </complexType>
</element>

所以你可以在这里看到 TextFieldList 可以有无限类型的 TextFieldBase 元素(可以是 textField、checkBox 和我省略的其他一些元素)。但是,在创建 WSDL 客户端时,.NET 似乎并不关心这一点,并像这样生成 textFieldList:

[System.Xml.Serialization.XmlArrayAttribute(Order=0)]
    [System.Xml.Serialization.XmlArrayItemAttribute("TextFieldBase", IsNullable=false)]
    public object[] textFieldList {
        get {
            return this.textFieldListField;
        }
        set {
            this.textFieldListField = value;
            this.RaisePropertyChanged("textFieldList");
        }
    }

我在 WSDL 中还有其他一些可以正常工作的抽象类型,在尝试比较它们时,我发现如果我从 TextFieldList 中删除 ma​​xOccurs="unbounded" 属性> 定义,然后.NET 将正确生成插入抽象类型的类型。不幸的是,我们需要能够拥有 1 个或多个 textFieldList 元素,这样就行不通了。

这只是 .NET 中的一个错误吗?或者是否有一些解决方法可以在不彻底改变 WSDL 的情况下工作?

我考虑的一种解决方法是将实现更改为一种选择,而不是使用抽象:

<complexType name="TextFieldList">
<choice maxOccurs="unbounded">
    <element ref="atf:textField" />
    <element ref="atf:checkBox" />
    <element ref="atf:radioButtonGroup" />
    <element ref="atf:listBox" />
    <element ref="atf:comboBox" /> 
</choice>
</complexType>

【问题讨论】:

    标签: .net visual-studio-2010 xsd wsdl svcutil.exe


    【解决方案1】:

    移动 maxOccurs 属性“修复”此问题。

    <complexType name="TextFieldList">
        <sequence maxOccurs="unbounded">
            <element ref="atf:TextFieldBase" />
        </sequence>
    </complexType>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 2020-12-02
      • 2019-04-22
      • 2021-02-21
      • 1970-01-01
      • 2012-06-14
      • 1970-01-01
      相关资源
      最近更新 更多