制作向后兼容的WCF服务

ash*_*999 9 wcf backwards-compatibility

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


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

不幸的是,我不能保证每个新版本的服务都会更新我的客户.不,我肯定很多人会尾随的最新版本,并有旧版本-多老,我不能肯定,但我知道他们会老:)

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

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


我看到的一些选项是:

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

Hei*_*nzi 9

默认情况下,WCF向后兼容.

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

最重要的是,以下操作不会导致旧客户端崩溃:

服务合同(方法)

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

数据契约(传递数据的自定义类)

  • 添加非必需属性.
  • 删除不需要的属性.

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


tom*_*ern 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); 
}  
Run Code Online (Sandbox Code Playgroud)

更改您的服务实施:

public class MyOriginalServiceType: IAugmentedServiceContract { }
Run Code Online (Sandbox Code Playgroud)