2011-12-05 47 views
4

我有返回Json的WCF服務。下面定義將動態數據成員添加到DataContract

[DataContract] 
    public class OptionData 
    { 
     [DataMember] 
     public string Book { get; set; } 
     [DataMember] 
     public string Id { get; set; } 
     [DataMember] 
     public string DealId { get; set; } 
     [DataMember] 
     public string DeliveryDate { get; set; } 
     [DataMember] 
     public string ExpiryDate { get; set; } 
    } 

而且經營合同規定

合同數據如下

[Description("Returns List of Options by user id")] 
     [WebGet(UriTemplate = "{sessionId}/Application/{applicationId}?start={start}&limit={limit}&page={page}", ResponseFormat = WebMessageFormat.Json)] 
     public List<OptionData> GetAllTask(string sessionId, string applicationId) 

我需要動態新的數據成員字段添加到OptionData類。

這樣做的最佳做法是什麼?

回答

1

如果你知道你想要JSON,你總是可以自己控制序列化(請參閱this post) - 只需使用現有的庫返回一串JSON即可。

如果您知道所有可能的字段名稱,另一種選擇是我們IsRequired = false

最後一種選擇是使用WCF用於Forward-Compatible Contracts的相同模式 - 僅將所有未知屬性附加到單個集合對象(ExtensionData)。ExtensionData只是根據this post的鍵/值對的字典。不幸的是 - ExtensionData不能直接寫入。這將是我的方法來模擬一下IExtensibleDataObject做...

[DataContract] 
public class OptionData 
{ 
    [DataMember] 
    public string Book { get; set; } 
    [DataMember] 
    public string Id { get; set; } 
    [DataMember] 
    public string DealId { get; set; } 
    [DataMember] 
    public string DeliveryDate { get; set; } 
    [DataMember] 
    public string ExpiryDate { get; set; } 
    [DataMember] 
    public Dictionary<string, string> Metadata { get; set;} 
} 
1

我不認爲這是可能的。

讓我們來思考一下您的DataContract是什麼:它是您的服務如何定義它所瞭解的內容 - 無論是作爲輸入還是輸出。客戶必須通過元數據交換髮現或從您提供的靜態代理類(很可能是dll)中找到這一點。

如果您即時更改合同,則沒有任何服務機制可讓其客戶知道合同已更改。無法即時更改合同。

即使您在運行中更改了類的定義(包括適當的屬性等),客戶端也無法找到它,因爲合同之前已經發布。

我無法想象需要使用什麼樣的機制來與客戶端進行這種動態交流。

我能想到的唯一解決方法是擁有一個參數,它接受一個字符串並允許客戶端以XML或類似方式傳遞任何可能的東西。這是一個非常討厭的黑客,雖然...

+0

根據他的代碼示例,他使用REST,因此不會有元數據交換或代理類。 –

0

如果您需要動態控制數據結構您的RESTful服務返回,我認爲你唯一的選擇是返回像XDocument的東西。你的服務操作可以創建一個任意結構的XDocument並返回它。話雖如此,我不知道當WCF嘗試將XDocument序列化爲JSON時會發生什麼。

2

只要客戶接受JSON 知道如何處理動態添加類的成員,您可以使用公認的答案,這SO question.列出的Expando的對象策略它使用ServiceStack庫,但你可以提取必要的代碼來做你想做的事。從ExpandoObject一個簡單的鍵/值對的方式被記錄在this code snippet.

編輯:我要指出的是,這種做法將不依賴於WCF所以它可能不會是你需要給什麼的問題的情況下。

+0

似乎仍然是一種危險的事情。 –

+2

確實如此。我會推薦一種更加REST風格的方法,它依賴*鏈接*在應用程序中實現此功能。這些鏈接將被客戶用來訪問任何需要特殊情況的類結構。當然,這不是格雷戈裏問的問題:) –

1

我只是碰到了這個確切的問題,因爲我最近張貼在這裏: Configuring WCF data contract for proper JSON response

我的解決辦法是使用ExpandoObject。然而,我不得不使用Newtsoft.json來做JSON序列化,然後我不得不讓我的web服務返回原始文本(而不是依賴於WCF序列化)。如果你喜歡,我會很高興發佈我的代碼。可能有辦法做動態數據合同,但我無法弄清楚。但我的解決方案完成這項工作。

+0

我虛心請求代碼,因爲它正是我目前正在研究的內容。謝謝 –

+0

也許我在這裏的答案將有所幫助:https:// stackoverflow .COM /問題/ 7590088 /讓-ASP淨WCF的轉換詞典到JSON-省略-鍵值標籤/ 27699637#27699637 – brando