ash*_*999 9 wcf backwards-compatibility
TLDR:如何创建向后兼容的WCF服务 - 也就是说,当我在服务器端部署新版本的服务时,旧版本上的所有客户端仍然可以使用该服务.
我正在创建一个Web服务,允许客户端应用程序获取插件列表.我将至少有一个操作FindPlugins(string nameOrDescription),在服务器上,将执行搜索并返回对象列表.
不幸的是,我不能保证每个新版本的服务都会更新我的客户.不,我肯定很多人会尾随的最新版本,并有旧版本-多老,我不能肯定,但我知道他们会老:)
如果我创建一个新的服务操作,更改架构,或在服务器端进行某种破坏操作,我就完成了.我需要始终设计向后兼容性.
这是一个例子.假设我返回一个Plugins 列表,每个列表都有一个名称和描述,我部署了我的服务v0.1.然后,我添加一个下载链接,并将其部署为我的服务的v0.2.
我看到的一些选项是:
FindPluginsV1,FindPluginsV2) - 对于多个操作似乎不实用默认情况下,WCF向后兼容.
以下MSDN链接包含WCF合同的所有可能更改的列表,并描述它们对旧客户端的影响:
最重要的是,以下操作不会导致旧客户端崩溃:
服务合同(方法)
数据契约(传递数据的自定义类)
因此,除非您将新DownloadLink字段标记为IsRequired(默认为false),否则您的更改应该没问题.
如果您查看这篇文章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)
| 归档时间: |
|
| 查看次数: |
3145 次 |
| 最近记录: |