使用Web Services将继承的类作为基类类型返回

时间:2009-09-25 12:13:54

标签: vb.net web-services design-patterns

我怀疑我在这里很傻但是我有以下设置

Class MustInherit myBaseClass
'some stuff

End Class

Class myInheritedClassA 
        inherits myBaseClass

'some more stuff
End Class


Class myInheritedClassB 
        inherits myBaseClass

'some more stuff
End Class

然后我有一个有方法

的网络服务
Function getSomeClass(id) as myBaseClass
'a factory here dependent on the id will generate a myInherited Class
return CType(aInstanceOfInheritedClass, mybaseClass)

End function

运行此操作会导致以下错误

Unhandled Exception: System.InvalidOperationException: 
   There was an error generating the XML document. ---> 
   System.InvalidOperationException: 
   The type <type> was not expected. 
   Use the XmlInclude or SoapInclude attribute to specify types 
   that are not known statically." 

所以我的问题是,是否有任何方法可以将继承的类“扩展”到基类,这样可行吗?

编辑:RE:关于XmlInclude(typeof inheritedClass)的建议,目前这个方法可能会返回许多类型的继承类(即myInheritedClassA和myInheritedClassB),只需要在这个标签中添加每个inheritedTypes ?

我修改了这个例子,希望能让事情更清楚

2 个答案:

答案 0 :(得分:3)

您必须使用XmlIncludeAttribute指定要返回的实际类型。

根据msdn XmlIncludeAttribute

  

应用XmlIncludeAttribute时,   指定派生类的类型。   当XmlSerializer序列化时   包含基数和   派生类,它可以   识别两种对象类型。

     

您可以使用XmlIncludeAttribute   包括服务中的派生类   写的描述文件   在Web服务描述中   语言(WSDL)。例如,如果是   方法返回一个Object,应用了   XmlIncludeAttribute到方法和   指定要返回的实际类型。

在样本下方

将atttibute应用于Web方法

<WebMethod(), XmlInclude(GetType(myInheritedClass))>
Function getSomeClass(id) as myBaseClass
     'a factory here dependent on the id will generate a myInherited Class
      return CType(aInstanceOfInheritedClass, mybaseClass)
End function

答案 1 :(得分:1)

您是否尝试过以下操作,即为GetSomeClass()返回的任何不同的继承类添加属性类SoapInclude? (见this MSDN reference

编辑: SoapInclude 是您使用SOAP编码,但确实使用 XmlInclude ,如果您的Web服务不是SOAP-per-se(它可能更好用于;-),语法相同)

<WebMethod(), SoapRpcMethod, SoapInclude(GetType(myInheritedClass)), _
   SoapInclude(GetType(MustInherit))> 

Function getSomeClass(id) as myBaseClass
'a factory here dependent on the id will generate a myInherited Class
return CType(aInstanceOfInheritedClass, mybaseClass)

End function