2009-08-20 47 views
1

假設我有一個WCF服務,並在合同的方法在wcf上使用泛型字典:我需要尋找什麼?

<ServiceContract()> _ 
Interface IThingService 
'... 
    <OperationContract()> _ 
    Function GetThing(thingId As Guid) As Thing 
End Interface 

其中事情是與普通特性的普通類,除了一個成員:

Public Class Thing 
    ' ... 
    Public Property Photos() As Dictionary(Of String, Photo) 
    ' ... 
End Class 

其中照片是用普通的類普通的屬性。

所以我跳入爲this MSDN article,並this blog post一些文檔,例如,現在我很困惑,如果我要了解很多有關的DataContractSerializer和服務如何序列化照片屬性的細節。

我是否需要去那裏,或者我可以做些什麼讓服務器上的WCF自動與我的客戶端交互?在我看來,所有的序列化細節應該可以被抽象出來 - 我只是想結束了,在消費客戶機應用程序,具有:

Dim foo as Thing = ThingServiceClient.GetThing(someGuid) 
Dim myPhotos as Dictionary(Of String, Photo) = foo.Photos 

什麼我需要在我的事的定義做做這個工作?我需要在其他地方做些什麼才能使其發揮作用?我是否需要擔心確保服務粘貼到DataContractSerializer,並且不會退回到使用XmlSerializer?

+0

哦,順便說一句,這個問題從這個較早的問題中流出來:http://stackoverflow.com/questions/1294269/getting-bad-generated-code-from-update-service-reference – 2009-08-20 11:39:00

+0

雖然沒有回答這個,但我們已經放棄了這種方法,因爲無關的設計原因,所以我不再需要答案 - 雖然我想知道... – 2009-09-11 17:40:12

回答

0

您需要確保您使用[DataContract]屬性來修飾「物品」,並且您希望包含在數據合同中的所有成員必須具有[DataMember]屬性。你的「Photo」類也是一樣。

只要你不必處理多態(繼承)和/或自定義集合,那應該是真的。剩下的部分應該由WCF運行時爲您負責。

馬克

+0

我沒有任何我的類的DataContract屬性,只要我添加它,我得到一個例外如下。任何想法我做錯了什麼? {「接收到對localhost/MyService/MyService.svc/...的HTTP響應時發生錯誤,這可能是由於服務端點綁定不使用HTTP協議造成的,也可能是由於HTTP請求上下文被服務器(可能由於服務關閉)。請參閱服務器日誌以獲取更多詳細信息。「} – 2009-08-20 16:58:44

+0

您使用的是什麼綁定?服務器日誌告訴你什麼? – 2009-08-20 17:17:25

+0

basicHttpBinding,並且服務器日誌中沒有任何內容。 – 2009-08-20 17:23:54

1

我會小心直接公開您的WCF合同(或ASMX web服務,或任何其他外部入口點進入系統)業務對象。這是外部系統使用的接口,即使您的業務對象在內部發生更改,此接口也應該保持不變。在服務器上也可以有對業務對象有意義的功能,但不在客戶端上。

此外,您突然需要修改您的商務對象,以便它符合您選擇的通信技術,例如,你必須在商業課上添加屬性,這些屬性與商務課程無關。

我將創建一個包含要傳輸到客戶端的數據並使用Thing實例中的數據初始化的ThingDTO(DTO =數據傳輸對象)。這意味着如果你認爲你的WCF服務是系統的門面,那麼ThingDTO就是你門面層的一部分。因此,控制WCF序列化的屬性可以在這裏自由進行。

這就是說,它是不一樣的,它對你的情況是有意義的。這只是我關於從WCF界面返回業務類的一般看法。

+0

我同意,但我也希望能回答我的問題。沒人知道? – 2011-07-20 02:39:46

1

我差點讓自己試圖解決這個問題。最後,我還活着,並且有一小段代碼。享受它:)

[DataContract, Serializable] 
[KnownType("GetKnownTypes")] 
public class Dto 
{ 
    [DataMember] 
    public Int PropertyA { get; set; } 

    [DataMember] 
    public String PropertyB { get; set; } 

    [DataMember] 
    public Dictionary<string, object> MyDictionary { get; set; } 

    private static Type[] GetKnownTypes() 
    { 
     return _myDictionaryValueTypes ?? new Type[] { Typeof(Dictionary<string, object>) }; 
    } 

    private void MyDictionaryValueTypes() 
    { 
     if (XmlDictionary == null) return; 
     _myDictionaryValueTypes = XmlDictionary.Values.Where(value => value != null).Select(value => value.GetType()).ToArray(); 
    } 
} 

唯一需要確保的是調用MyDictionaryValueTypes,就是這樣。

相關問題