TLDR:如何创建向后兼容的 WCF 服务-- 也就是说,当我在服务器端部署新版本的服务时,旧版本上的所有客户端都可以仍然使用该服务。
我正在创建一个 Web 服务,允许客户端应用程序获取插件列表。我至少会进行一次手术,例如FindPlugins(string nameOrDescription)
它将在服务器上进行搜索并返回对象列表。
不幸的是,我不能保证我的客户都会随着我的服务的每个新版本的更新而更新;不,我是sure其中许多将跟踪最新版本,并且会有旧版本——我不确定有多旧,但我知道它们会旧:)
如果我创建一个新的服务操作,更改架构,或者在服务器端进行某种破坏操作,我就完成了。我需要始终设计向后兼容性。
这是一个例子。假设我返回一个列表Plugin
s,每个都有名称和描述,我部署了我的服务 v0.1。然后,我添加一个下载链接,并将其部署为我的服务的 v0.2。
我看到的一些选项是:
- 强制客户端更新到最新服务(不可行)
- 中断对老客户的服务(不可行)
- 将版本号附加到每个操作并仅使用特定于版本的操作(例如
FindPluginsV1
, FindPluginsV2
) -- 对于多个操作来说似乎不太实用
- 为每个新版本提供新服务——似乎不切实际
WCF 默认情况下是向后兼容的。
以下 MSDN 链接包含 WCF 合同所有可能更改的列表,并描述了它们对旧客户端的影响:
- WCF 要点:版本控制策略 http://msdn.microsoft.com/en-us/library/ff384251.aspx
最重要的是,以下操作将not导致老客户端崩溃:
服务合同(方法)
- 添加方法参数:从旧客户端调用时将使用默认值。
- 删除方法参数:旧客户端发送的值将被默默忽略。
- 添加新方法:显然,老客户不会调用它们,因为他们不认识它们。
数据契约(用于传递数据的自定义类)
因此,除非您标记新的DownloadLink
字段为是必须的 http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datamemberattribute.isrequired%28v=vs.110%29.aspx(默认为false),你的改变应该没问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)