wcf - 提供向后兼容的WCF服务

标签 wcf backwards-compatibility

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

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

不幸的是,我不能保证我的客户都会随着我的服务的每个新版本而更新;不,我确信其中许多将跟踪最新版本,并且将具有旧版本-不确定多大,但我知道它们将是旧的:)

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

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

我看到的一些选项是:

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

    WCF默认情况下向后兼容。

    以下MSDN链接包含WCF契约(Contract)的所有可能更改的列表,并描述了它们对旧客户端的影响:

  • WCF Essentials: Versioning Strategies

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

    服务契约(Contract)(方法)
  • 添加方法参数:从旧客户端调用时将使用默认值。
  • 除去方法参数:旧客户端发送的值将被静默忽略。
  • 添加新方法:显然,老客户不会调用它们,因为他们不认识它们。

  • 数据契约(Contract)(用于传递数据的自定义类)
  • 添加不需要的属性。
  • 删除不需要的属性。

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

    关于wcf - 提供向后兼容的WCF服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8826017/

    相关文章:

    c# - 在另一个进程中处理 WCF 事件

    wcf - WCF 服务应该抛出什么异常类型?

    html - 如何在 <IE6 旧版浏览器中仅显示 HTML

    postgresql - PostgreSQL 模式的命名空间版本以实现向后兼容性?

    scala - 小版本更新可以用来小更新传递依赖吗?

    c++ - 为什么 C++ 标准不更改 std::set 以使用 std::less<> 作为其默认模板参数?

    具有优先级的 WCF 端点

    c# - WCF Web 服务和数据损坏

    silverlight - RIA 服务与 WCF 服务

    soap - SOAP/WSDL 中的 API 能否轻松保持向后兼容?