如何维护同一个wcf服务的多个版本

Tho*_*mas 5 wcf

假设我在生产pc中运行wcf服务.只需指导我需要添加代码以便为我的服务提供版本.

我需要单独维护服务合同和数据合同的版本吗?只是给我一个创建至少两个版本的wcf服务的小例子.

如果几个客户端正在消耗我的服务,如果我改变任何现有的服务合同方法或添加更多的方法来服务合同那么会发生什么......在那种情况下客户可以调用我的服务或他们需要再次创建代理以获取服务合同中的更改.如果有人用小样本代码讨论我的所有观点以清楚地了解这个想法,那将会非常有帮助.谢谢

Rik*_*erg 4

您需要考虑一些事情。首先,您需要将命名空间添加到您的合约和模式/消息中。为什么?因为如果版本 1 和版本 2 具有相似的操作和消息,它们可能会相互冲突。添加命名空间将使代码/客户端知道他正在处理两种不同的实现。

其次,您可能想问为什么要更改服务合同。是不是因为需要添加需求操作。或者它是一个全新的功能,可以分成一个新的 WCF 服务。如果您想维护版本,请将全新的功能放入新服务中,如果它必须是当前服务的一部分,请复制合同并创建单独的版本。

更改服务合同将破坏当前正在使用该合同的客户端。为服务创建单独的版本将允许您当前的客户端继续使用以前的版本,直到您更新该客户端。所以你会得到这样的东西。

namespace MyNamespace.Contracts.V1
{
    [ServiceContract(Namespace = "urn:company:project:servicename:v1")]
    public interface IService
    {
        [OperationContract]
        void RequirementA();
    }
}
namespace MyNamespace.Contracts.V2
{
    [ServiceContract(Namespace = "urn:company:project:servicename:v2")]
    public interface IService
    {
        [OperationContract]
        void RequirementA();

        [OperationContract]
        void RequirementB();
    }
}
Run Code Online (Sandbox Code Playgroud)

两个版本都将单独托管,您的实施也会有所不同。但是,您可以让实现将您的操作委托给某种支持这两个版本的(业务)控制器,并且您的流程将如下所示。

  • V1.IService - V1.Implementation 将调用委托给 MyServiceController
  • V2.IService - V2.Implementation 还将委托调用 MyServiceController

通过这种方式,您可以让 1 个控制器处理需要执行的任何(业务)逻辑,从而防止任何可能的重复代码。