我有返回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类中。
这样做的最佳做法是什么?
答案 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时会发生什么。