我有一個相當複雜的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>