TLDR:如何创建向后兼容的WCF服务 - 也就是说,当我在服务器端部署新版本的服务时,旧版本上的所有客户端都可以仍在使用该服务。
我正在创建一个允许客户端应用程序获取插件列表的Web服务。我将至少有一个像FindPlugins(string nameOrDescription)
这样的操作,它将在服务器上进行搜索并返回一个对象列表。
不幸的是,我不能保证每个新版本的服务都会更新我的客户;不,我肯定他们中的许多人将会追踪最新版本,而且会有旧版本 - 多久了,我不能确定,但我知道他们会老了:)
如果我创建一个新的服务操作,更改架构,或在服务器端进行某种破坏操作,我就完成了。我需要始终设计向后兼容性。
这是一个例子。假设我返回一个Plugin
的列表,每个列表都有一个名称和描述,我部署了我的服务的v0.1。然后,我添加一个下载链接,并将其部署为我的服务的v0.2。
我看到的一些选项是:
FindPluginsV1
,FindPluginsV2
) - 对于多个操作似乎不实用答案 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 { }