2013-02-07 79 views
0

我有一個公開的函數WCF服務:WCF多態參數

Public Function FeedAnimal(ByVal animal As Animal) As Animal Implements IFarm.FeedAnimal 
    animal.Feed() 
    Return animal; 
End Function 

然而動物是一個抽象類,與許多派生類型,每一個都有自己的屬性。然而,當我在SOAPUI中用可能表示牛的屬性發出請求時,我得到一個錯誤,我無法創建一個抽象類。我如何讓WCF將參數反序列化爲它的實際類型?我們假設他們都可以通過其不同名稱的屬性區分開來。

我已經嘗試在任何地方添加KnownType屬性,無濟於事。這樣做可以讓我返回派生類型,但不接受它們作爲參數。

如果我想要做的是完全瘋了,請告訴我下一個最近的事情

編輯;我會滿意,如果我可以把它回落到XmlSerializer的只有這個功能,它使用在以前版本的

[ServiceContract(Namespace:=Constants.SERVICE_NAMESPACE)] 
[ServiceKnownType(GetType(Cow))] 
Public Interface IFarm 
    [OperationContract()] 
    [ServiceKnownType(GetType(Cow))] 
    [Validation(CheckAssertions:=False, SchemaValidation:=True)] 
    Function FeedAnimal(ByVal animal As Animal) _ 
     As Animal 
End Interface 

上班,類

[KnownType(GetType(Cow))] 
Public MustInherit Class Animal 
    Public weight As Integer 
End Class 

Public Class Cow 
    Inherits Animal 
    Public mooPower As Double 
End Class 

和請求:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:v3="mycomapnyaddresss" xmlns:foo="animalnamespace"> 
    <soap:Header/> 
    <soap:Body> 
    <v3:FeedAnimal> 
    <!--Optional:--> 
    <v3:animal> 
     <!--Optional:--> 
     <foo:weight>100</foo:weight> 
     <foo:mooPower>10.0</foo:mooPower> 
    </v3:animal> 
    </v3:FeedAnimal> 

回答

1

你有沒有特里結構d ServiceKnownType屬性?

這裏有一篇博客文章MSDN,它很好地解釋了它。

ServiceKnownType進入實際的服務接口本身...

+0

我已經添加到ServiceKnownType接口本身和方法定義 – MrEff

1

你必須在KnownType屬性添加到合同:

<DataContract(), KnownType(GetType(Cow)), KnownType(GetType(Dog))> _ 
Public Class Animal 
    ... 
End Class 
+0

我已經將KnownType添加到抽象類。這使我能夠返回一個類型爲Animal的值。但是,我仍然無法說服它將請求參數反序列化爲一個Cow – MrEff

+0

公佈相關數據和服務合同。 –

+0

合同已過帳 – MrEff