制作向后兼容的WCF服务

时间:2012-01-11 20:17:24

标签: wcf backwards-compatibility

TLDR:如何创建向后兼容的WCF服务 - 也就是说,当我在服务器端部署新版本的服务时,旧版本上的所有客户端都可以仍在使用该服务。


我正在创建一个允许客户端应用程序获取插件列表的Web服务。我将至少有一个像FindPlugins(string nameOrDescription)这样的操作,它将在服务器上进行搜索并返回一个对象列表。

不幸的是,我不能保证每个新版本的服务都会更新我的客户;不,我肯定他们中的许多人将会追踪最新版本,而且会有旧版本 - 多久了,我不能确定,但​​我知道他们会老了:)

如果我创建一个新的服务操作,更改架构,或在服务器端进行某种破坏操作,我就完成了。我需要始终设计向后兼容性。

这是一个例子。假设我返回一个Plugin的列表,每个列表都有一个名称和描述,我部署了我的服务的v0.1。然后,我添加一个下载链接,并将其部署为我的服务的v0.2。


我看到的一些选项是:

  • 强制客户更新到最新服务(不可行)
  • 为旧客户打破服务(不可行)
  • 为每个操作附加版本号,仅使用特定于版本的操作(例如FindPluginsV1FindPluginsV2) - 对于多个操作似乎不实用
  • 为每个新版本提供新服务 - 似乎不切实际

2 个答案:

答案 0 :(得分:9)

默认情况下,WCF是向后兼容的。

以下MSDN链接包含WCF合同的所有可能更改的列表,并描述它们对旧客户端的影响:

最重要的是,以下操作会导致旧客户端中断:

服务合同(方法)

  • 添加方法参数:从旧客户端调用时将使用默认值。
  • 删除方法参数:旧客户端发送的值将被静默忽略。
  • 添加新方法:显然,旧客户不会打电话给他们,因为他们不知道。

数据合同(传递数据的自定义类)

  • 添加不需要的属性。
  • 删除不需要的属性。

因此,除非您将新的DownloadLink字段标记为IsRequired(默认为 false ),否则您的更改应该没问题。

答案 1 :(得分:0)

如果你看看这篇文章http://blogs.msdn.com/b/craigmcmurtry/archive/2006/07/23/676104.aspx

该家伙提供的第一个例子将满足您的要求。它的好处是现有客户端不会中断,您可以通过这种方式添加任意数量的新服务操作。

[ServiceContract] 
public interface IMyServiceContract 
{    
    [OperationContract(IsOneWay=true)]    
    public void MyMethod(MyDataContract input); 
}

[ServiceContract] 
public interface IMyAugmentedServiceContract: IMyServiceContract 
{    
    [OperationContract(IsOneWay=true)]    
    public void MyNewMethod(MyOtherDataContract input); 
}  

更改服务实施:

public class MyOriginalServiceType: IAugmentedServiceContract { }