【问题标题】:How to name multiple versioned ServiceContracts in the same WCF service?如何在同一个 WCF 服务中命名多个版本化的 ServiceContract?
【发布时间】:2011-02-01 07:07:09
【问题描述】:

当您必须在 ServiceContract 中引入重大更改时,最佳做法是保留旧的并创建新的,并在命名空间中使用一些版本标识符。

如果我理解正确,我应该能够做到以下几点:

[ServiceContract(Namespace = "http://foo.com/2010/01/14")]
public interface IVersionedService
{
    [OperationContract]
    string WriteGreeting(Person person);
}

[ServiceContract(Name = "IVersionedService", Namespace = "http://foo.com/2010/02/21")]
public interface IVersionedService2
{
    [OperationContract(Name = "WriteGreeting")]
    Greeting WriteGreeting2(Person2 person);
}

有了这个,我可以创建一个支持这两个版本的服务。这确实有效,并且在从 soapUI 进行测试时看起来不错。

但是,当我在 Visual Studio 中使用“添加服务引用”创建客户端时,VS 会忽略命名空间,只会看到两个同名的接口。为了区分它们,VS 在其中一个的名称中添加了“1”。我最终得到了调用的代理

ServiceReference.VersionedServiceClient

ServiceReference.VersionedService1Client

现在任何人都不容易看出哪个是较新的版本。

我应该给接口起不同的名字吗?例如

IVersionedService1
IVersionedService2

IVersionedService/2010/01/14
IVersionedService/2010/02/21

这不会破坏命名空间的目的吗?

我是否应该将它们放在不同的服务类中并为每个版本获取一个唯一的 URL?

【问题讨论】:

    标签: visual-studio wcf web-services namespaces versioning


    【解决方案1】:

    嗯,通常情况下,您不会有一个同时实现旧接口和新接口的服务实现。因此,如果一个新客户端出现并连接到您的新服务,它只会获得新接口,一切都很好。

    如果您需要能够同时提供这两个接口,那么可以——您需要做一些“魔术”来实现这一点:

    • 如果可以的话,从旧接口派生出新接口。只要您只添加新东西,这就会起作用。一个新的服务实现将同时实现旧式接口,以及新的

      public interface IVersionedService2 : IVersionService1
      {
          [OperationContract(Name = "WriteNewGreeting")]
          Greeting WriteNewGreeting(Person2 person);
      }
      

      因此,您的服务实现将同时具有 WriteGreetingWriteNewGreeting 方法 - 新客户端可以连接并使用其中任何一个,而旧客户端仍会看到其 IVersionService1 接口和“旧”命名空间,从而能够继续调用您的服务

    • 如果您不能从旧服务派生新服务,请创建一个全新的服务,并将其公开在新的端点上,例如一个新的地址或端口。这样,现有客户端可以继续调用现有的和众所周知的服务,而新客户端可以被定向到单独端点上的单独服务,这对他们来说也应该没问题

    【讨论】:

    • 谢谢。实际上,我不必从旧接口派生新接口来实现两者。我的服务执行 public class VersionedService : IVersionedService, IVersionedService2 并且工作正常。我的问题更多的是,当我已经在使用版本化的 XML 命名空间时,是否必须向接口添加一个递增的数字?您的回答似乎暗示我必须这样做。
    • @Tor:不,不一定。如果您在两个单独的 XML 命名空间中具有相同的接口(旧的和新的),并且暴露在两个单独的端点(两个 URL)上,那么客户端将始终选择一个或另一个,并且在命名上不会有任何冲突,我想想。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    相关资源
    最近更新 更多