當您必須在ServiceContract中引入重大更改時,最佳做法是保留舊的更改並創建一個新的更改,並在命名空間中使用某些版本標識。如何在同一個WCF服務中爲多個版本化的ServiceContracts命名?
如果我理解正確這,我應該能夠做到以下幾點:
[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
現在是不容易的,任何人看到這是較新的版本。
我應該給接口使用不同的名字嗎? E.g
IVersionedService1
IVersionedService2
或
IVersionedService/2010/01/14
IVersionedService/2010/02/21
這難道不是打敗命名空間的目的是什麼?
我應該將它們放在不同的服務類中,併爲每個版本獲取唯一的URL嗎?
感謝。我實際上不必從舊的接口中派生出新的接口來實現這兩個接口。我的服務確實是 public class VersionedService:IVersionedService,IVersionedService2 它工作正常。我的問題更多的是,當我已經使用版本化的XML命名空間時,是否必須向接口添加遞增的數字?你的回答似乎意味着我必須這樣做。 – 2010-03-27 06:43:46
@Tor:不,不一定。如果你在兩個單獨的XML命名空間中有相同的接口 - 新舊接口,並在兩個單獨的端點(兩個URL)上公開 - 那麼客戶端將總是選擇一個或另一個,並且它不會在命名中發生任何衝突,認爲。 – 2010-03-27 09:28:11