gpt4 book ai didi

visual-studio - 如何在同一个 WCF 服务中命名多个版本化的 ServiceContract?

转载 作者:行者123 更新时间:2023-12-04 07:38:12 24 4
gpt4 key购买 nike

当您必须在 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 会忽略命名空间,只会看到两个同名的接口(interface)。为了区分它们,VS 在其中一个的名称中添加了“1”。我最终得到了代理
ServiceReference.VersionedServiceClient


ServiceReference.VersionedService1Client

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

我应该给接口(interface)不同的名字吗?例如
IVersionedService1
IVersionedService2

或者
IVersionedService/2010/01/14
IVersionedService/2010/02/21

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

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

最佳答案

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

如果您需要能够提供这两个接口(interface),那么是的 - 您需要做一些“魔术”来使这成为可能:

  • 如果可以,从旧接口(interface)派生新接口(interface)。只要您只添加新东西,这就会起作用。然后,新的服务实现将实现旧式接口(interface)以及新式接口(interface)
    public interface IVersionedService2 : IVersionService1
    {
    [OperationContract(Name = "WriteNewGreeting")]
    Greeting WriteNewGreeting(Person2 person);
    }

    因此,您的服务实现将同时具有 WriteGreeting以及 WriteNewGreeting方法 - 新客户端可以连接并使用其中任何一个,而旧客户端仍会看到其 IVersionService1 接口(interface)和“旧”命名空间,因此能够继续调用您的服务
  • 如果您无法从旧服务派生新服务,请创建一个全新的服务,并将其公开在新的端点上,例如一个新的地址或端口。这样,现有客户端可以继续调用现有的和众所周知的服务,而新客户端可以被定向到单独端点上的单独服务,并且对他们来说也应该没问题
  • 关于visual-studio - 如何在同一个 WCF 服务中命名多个版本化的 ServiceContract?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2525416/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com