【发布时间】: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