使用maxOccurs属性时,.NET自动生成的WSDL客户端不处理抽象类型
我在VisualStudio中添加了一个相当复杂的WSDL作为服务引用。我遇到的问题是,自动生成的客户机代码没有正确地处理抽象类型(并且忽略了替代该抽象类型的所有类型)。我不想发布整个WSDL,但这里有一个片段:使用maxOccurs属性时,.NET自动生成的WSDL客户端不处理抽象类型,.net,visual-studio-2010,xsd,wsdl,svcutil.exe,.net,Visual Studio 2010,Xsd,Wsdl,Svcutil.exe,我在VisualStudio中添加了一个相当复杂的WSDL作为服务引用。我遇到的问题是,自动生成的客户机代码没有正确地处理抽象类型(并且忽略了替代该抽象类型的所有类型)。我不想发布整个WSDL,但这里有一个片段: <complexType name="AddTextFields"> <complexContent> <extension base="ti:TransformationInstructions">
<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>
我在WSDL中有一些其他的抽象类型可以正常工作,在尝试比较它们时,我发现如果我从TextFieldList定义中删除maxOccurs=“unbounded”属性,那么.NET将正确生成插入抽象类型的类型。不幸的是,我们需要能够有一个或多个textFieldList元素,这样就无法工作
这只是.NET中的一个bug吗?或者是否有一些变通方法可以在不大幅更改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>
移动maxOccurs属性“修复”了此问题
<complexType name="TextFieldList">
<sequence maxOccurs="unbounded">
<element ref="atf:TextFieldBase" />
</sequence>
</complexType>
<complexType name="TextFieldList">
<sequence maxOccurs="unbounded">
<element ref="atf:TextFieldBase" />
</sequence>
</complexType>