2011-12-05 24 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