2013-04-04 20 views
0

我有一個相當複雜的WSDL,我將其添加爲Visual Studio中的服務引用。我遇到的問題是自動生成的客戶端代碼沒有正確處理抽象類型(並且忽略了替代該抽象類型的所有類型)。我不想張貼整個WSDL,但這裏是一個片段:當使用maxOccurs屬性時,.NET自動生成的WSDL客戶端不處理抽象類型

<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的無限元素(可以是文本框,複選框和其他一些人,我省略) 。但是,在創建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定義中刪除maxOccurs =「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> 

回答

1

移動maxOccurs屬性「修復」這一點。

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