我有一个返回复杂对象的WebService。
public class Resource;
public class Asset extends Resource;
public class Collection extends Resource;
返回子类的方法可以正常工作:
Asset[] getAssets();
Collection[] getCollections();
但是返回基类的方法正在生成异常:
Resource[] getResources();
WebService本身是使用CXF用java编写的,但我认为这不重要。我甚至可以将基类方法与使用java创建的示例客户端一起使用。
以下是使用.Net客户端的例外:
`Unhandled Exception: System.InvalidOperationException: There is an error in XML document (1, 173). ---> System.InvalidOperationException: The specified type was not recognized: name='asset', namespace='http://www.turimsaint.com/', at <return xmlns=''>`.
以下是wsdl.exe生成的客户端代码
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("", RequestNamespace = "http://www.turimsaint.com/", ResponseNamespace = "http://www.turimsaint.com/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
[return: System.Xml.Serialization.XmlElementAttribute("return", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
public Resource[] getCollectionContents([System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] Collection p_collection)
{
object[] results = this.Invoke("getCollectionContents", new object[] {
p_collection});
return ((Resource[])(results[0]));
}
最后这是相关元素的wsdl:
- <xs:complexType name="collection">
- <xs:complexContent>
- <xs:extension base="tns:resource">
- <xs:sequence>
<xs:element name="_instructor" type="xs:string" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
- <xs:complexType abstract="true" name="resource">
- <xs:sequence>
<xs:element name="_title" type="xs:string" />
<xs:element name="_deepLink" type="xs:string" />
<xs:element name="_id" type="xs:string" />
<xs:element name="_description" type="xs:string" />
<xs:element name="_type" type="xs:string" />
<xs:element maxOccurs="unbounded" name="_metadata" type="tns:resourceMetadata" />
</xs:sequence>
</xs:complexType>
....
- <xs:complexType name="getResourceByIDResponse">
- <xs:sequence>
<xs:element minOccurs="0" name="return" type="tns:resource" />
</xs:sequence>
</xs:complexType>
任何帮助表示赞赏。 感谢。
答案 0 :(得分:0)
这是一个挖掘,自从使用.Net 2.0风格的Web服务客户端以来已经有一段时间了。
如果我没记错的话,你必须做一些属性工作。您必须通知基类'resources'关于可能派生的类'Asset'-'Collection'或通过将属性放在顶部来返回派生类之一的方法。
看看
http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlincludeattribute.aspx
希望这有帮助,