【问题标题】:WCF - handle versioningWCF - 处理版本控制
【发布时间】:2012-01-10 16:56:58
【问题描述】:

如果我需要退出此服务合同:

[ServiceContract(Namespace="http://api.x.com/Svc1")]
public interface IService1
{
   [OperationContract(Name = "AddCustomer")]
   bool AddCustomer(DTOCustomer1 customer);
}

对此:

[ServiceContract(Namespace="http://api.x.com/Svc1")]
public interface IService1
{
   [OperationContract(Name = "AddCustomer")]
   bool AddCustomer(DTOCustomer2 customer);
}

根据这篇好文章:Versioning WCF 我明白,当数据契约发生变化时,需要在新命名空间中定义一个新的 vs of 数据契约,然后在新命名空间中定义一个新的 vs of 服务契约,之后应该添加一个新端点。

我究竟应该如何完成这项工作。有没有任何地方的例子?你能根据我上面显示的服务合同写点什么吗?

提前谢谢你!

【问题讨论】:

  • 您也可以考虑通过在服务的 URL 链接中包含版本号来处理 WCF 版本控制。在 WCF 服务项目中,您也可以为每个版本使用不同的文件夹。
  • @Dmitry:我觉得这很有趣。你能指出与此相关的任何链接吗?谢谢
  • 我不记得我在哪里找到了这种方法...但是这里有一些链接 stackoverflow.com/questions/931109/… 和 stackoverflow.com/questions/2306181/…

标签: wcf namespaces versioning contracts


【解决方案1】:

根据链接的文章,您应该执行以下操作:

[ServiceContract(Namespace="http://api.x.com/Svc1")]
public interface IServiceNew : IService1
{
   [OperationContract(Name = "AddCustomerNew")]
   bool AddCustomer(DTOCustomer2 customer);
}

然后在你的服务中实现它:

public class MyCurrentServiceImplementation : IServiceNew 
{...}

您将需要重新部署您的服务,但现有客户端应该能够继续调用 AddCustomer 操作,而新客户端可以调用 AddCustomerNew 操作。

【讨论】:

  • 非常感谢,非常感谢!是的,我一直在等待类似的事情。剩下的唯一事情就是为新的 svc 合约定义一个新的端点,对吧?
  • 是的,您应该在一个新端点上公开新的服务合同——这将使新操作可用
  • 如果 'MyCurrentServiceImplementation' 以前是:'MyCurrentServiceImplementation: IService1' 现在会变成 'MyCurrentServiceImplementation: IServiceNew' 对吗?
  • 让我尝试一个简单的测试,并会接受你的答案...非常感谢休!
  • 老实说,我认为配置的重用不会在很大程度上影响我必须做出的任何与服务组合相关的决策。
【解决方案2】:

请务必注意您在帖子中陈述的假设:

"当数据合约发生变化时,需要定义一个新的 vs of 新命名空间中的数据合约"

并不总是正确的。请参阅 MSDN 上的 "Data Contract Versioning",了解数据合同更改不会破坏的许多情况,因此可能不需要任何操作,除了可能修改服务方法的内部实现来处理存在/不存在由于数据合同版本之间的差异而导致某些数据。

在这个具体的例子中,我会质疑一个名为AddCustomer 的方法的两个版本如何在它们的意图上如此不同,以至于它证明创建一个新的服务接口是合理的。如果没有看到您的新旧数据合同,我无法确定,但我猜这里真正的问题是该方法已经发展到接受额外的客户信息。

如果这是真的,那么这很像方法调用中可选参数的情况。 WCF 旨在很好地处理这种情况,作为对数据协定的非破坏性更改。只要您可以遵循 MSDN 上 "Best Practices: Data Contract Versioning" 中的指南,那么您的现有 服务接口就可以很好地接受提供旧版本或新版本合同的调用。给定客户端和服务器数据协定的组合,您的服务方法将获得可能的数据。

我会保持我的服务接口连贯、简单和干净(即避免执行 IServiceNew 之类的操作),而只是添加到数据协定并修改 AddCustomer 的实现以适应它接收到的任何数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多