Visual Studio でサービス参照として追加するかなり複雑な WSDL があります。私が抱えている問題は、自動生成されたクライアント コードが抽象型を適切に処理していない (そして、その抽象型に代わるすべての型を無視している) ことです。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 型の要素を無制限に持つことができることがわかります (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定義からmaxOccurs="unbounded"属性を削除すると、.NET が抽象型にプラグインする型を正しく生成することがわかりました。 . 残念ながら、1 つ以上の textFieldList 要素を持つことができる必要があるため、機能しません。
これは .NET の単なるバグですか? または、WSDL を大幅に変更せずに機能する回避策はありますか?
私が検討した回避策の 1 つは、抽象を使用する代わりに、実装を選択肢に変更することでした。
<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>