2009-09-25 137 views
1

我懷疑我是非常愚蠢的在這裏,但我有以下設置返回一個繼承類的基類與Web服務

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 

我再有,有一個方法Web服務

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)是它只需要添加每個繼承類型在這個標籤?

我修改了例子,希望讓事情更清晰

回答

1

你試過以下,即增加對屬性類SoapInclude什麼不同繼承類GetSomeClass()可能返回? (見this MSDN reference

編輯:SoapInclude是,如果你使用SOAP編碼,但不要使用XmlInclude,具有相同的語法,如果您的Web服務是不能用肥皂,每本身(這它可能是更好的;-))

<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 
3

你必須使用XmlIncludeAttribute來指定實際返回的類型。

按照MSDN XmlIncludeAttribute

當應用XmlIncludeAttribute, 指定派生類的類型。 當XmlSerializer將包含基類和 派生類的對象序列化爲 時,它可以接着 識別這兩個對象類型。

可以使用XmlIncludeAttribute到 包括在服務 描述文檔派生類在Web服務描述 語言(WSDL)書面 。例如,如果 方法返回對象,則將 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 
+0

@Ramesh中使用的屬性的語法是,C#(OP需要VB.NET),但足夠接近。現在,很好的結果,我假定OP使用SOAP編碼,但是在使用「純文本」編碼的情況下,XmlInclude就是票據。我會相應地修復我的迴應。 – mjv 2009-09-25 13:29:21

+0

@mjv你是對的! C#剛剛回答時自然而然,因爲它已經好幾年了,我停止vb ....將現在更新... – RameshVel 2009-09-25 13:56:34