将动态数据名称添加到DataContract

时间:2011-12-05 21:01:39

标签: wcf json

我有返回Json的WCF服务。

下面定义的数据合同

  [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)

我需要动态地将新的DataMember字段添加到OptionData类中。

这样做的最佳做法是什么?

5 个答案:

答案 0 :(得分:2)

只要接收到json 的客户端知道 如何处理动态添加的类成员,您就可以使用接受的答案中概述的Expando对象策略{{ 3}}它使用ServiceStack库,但您可以提取必要的代码来执行您想要的操作。在SO question.

中记录了ExpandoObject的简单键/值对方法

编辑:我应该指出,这种方法不会依赖于WCF,因此根据问题的上下文,它可能不是您所需要的。

答案 1 :(得分:1)

我不认为这是可能的。

让我们考虑一下你的DataContract是什么:它是你的服务如何定义它所知道的 - 作为输入或输出。客户端必须通过元数据交换发现或从您提供的静态代理类(可能是dll)中找到它。

如果您动态更改合同,则您的服务没有机制让其客户知道合同已更改。没有办法动态改变合同。

即使您动态更改了类的定义,包括正确的属性等,客户也无法找到它,因为合同之前已经发布过。

我无法想象需要什么样的机制来与客户端即时通信这样的变更。

我能想到的唯一解决方法是拥有一个接受字符串的参数,并允许客户端传入XML或类似的东西。虽然这是一个非常讨厌的黑客......

答案 2 :(得分: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;}
} 

答案 3 :(得分:1)

我刚刚在这里发布了这个确切的问题: Configuring WCF data contract for proper JSON response

我的解决方案是使用ExpandoObject。但是,我必须使用Newtsoft.json来执行JSON序列化,然后我必须使我的webservice返回原始文本(而不是依赖于WCF序列化)。如果你愿意,我很乐意发布我的代码。可能有办法做动态数据交换,但我无法弄清楚。但我的解决方案完成了这项工作

答案 4 :(得分:0)

如果您需要动态控制RESTful服务返回的数据结构,我认为您唯一的选择是返回类似XDocument的内容。您的服务操作可以创建任意结构的XDocument并返回该结构。话虽这么说,我不确定当WCF尝试将XDocument序列化为JSON时会发生什么。