2010-08-12 93 views
1

我有一個WCF服務,我與共享程序集中的客戶端共享類型。 如果客戶端創建派生類,是否可以將派生類型傳遞迴服務,以便我可以通過反射讀取添加的屬性?WCF與客戶端上的共享對象和派生類

我試過了,但有KnownTypes的問題,因爲服務不知道如何反序列化派生類型。

[Serializable] 
public abstract class Car : ICar 
{........ 

//在客戶端上:

[Serializable] 
public class MyCar : Car 
{...... 

傳遞myCar到服務,我得到的異常抱怨knownType,但我不能添加此服務器上,因爲我不知道客戶會什麼時候通過發送,我想通過反射處理額外的屬性。

可能在運行時將客戶端類型註冊爲知識類型?
這可能是解決方案嗎? http://blogs.msdn.com/b/sowmy/archive/2006/03/26/561188.aspx

回答

0

這是不可能的。服務和客戶端都必須知道將在消息中發送哪些類型。如果你想使用已知的類型,你必須在服務上定義與父類型的關係。

爲什麼你需要知道服務器上添加的屬性?

+0

基本上,我需要在客戶端上搜索能夠通過添加屬性(用於UI)來擴展基類。然後該服務將反映該類並獲取這些額外的屬性並將其保存到數據庫中。當客戶端調用GetCar(id)時,服務會將這些屬性添加到基類併發回。 有沒有辦法將客戶端派生類型傳遞(註冊)到服務中,以便服務可以註冊它並將其用於此目的(使用Dictionary DeWet 2010-08-13 08:39:13

+0

,字符串>這些額外的屬性?實際上有一種方法可以從客戶端獲得額外的屬性 - 您的數據協定必須實現IExtensibleDataObject。這個接口應該用於不同的場景,但如果你想使用反射,你可能會達到你的要求。檢查:http://geekswithblogs.net/EltonStoneman/archive/2009/04/03/accessing-extended-data-from-iextensibledataobject.aspx – 2010-08-13 09:09:20

+0

Dictionary 是我最初的方法,但將對象鏈接到用於編輯的屬性網格無法正常工作,因爲您的bas類屬性coorectly displayd,然後必須添加用戶問題的字典屬性的自定義編輯器爲什麼這些單獨。 經過一番調查後,您會看到您的鏈接並重播。 謝謝 – DeWet 2010-08-13 09:49:29

0

我覺得有一種方法。

我依稀記得,當我學習WCF時,我遇到了ExtensionData,它應該是一種機制來獲得與類的序列化不匹配的所有內容。例如,如果您啓用ExtensionData,你在這種情況下

//Server 
public class GenericRQ 
{ 
    public string GenericProperty {get;set;} 
} 


public Service GenericService 
{ 
    Public void GenericMethod(GenericRQ RQ) 
    { 
    } 

} 

// client 

Public class MoreSpecificRQ : GenericRQ 
{ 
    public string SpecificProperty {get;set;} 
} 

Public void GenericMethod(GenericRQ RQ) 
    { 
    // the serializer adds automatically in RQ.ExtensionData everything that has come and that does not match the class GenericRQ. 

    } 

如何啓用ExtensionData您可以輕鬆地在網絡