2011-01-27 59 views
8

有沒有辦法更改WCF ServiceContract接口的.NET名稱空間,但是仍然使WCF服務向後兼容使用舊的(與命名空間完全相同)ServiceContract的客戶端?例如,假設我有(在vb.net):我可以在不更改服務的情況下更改WCF ServiceContract接口的名稱空間嗎?

Namespace MyCompany.MyPoorlyNamedProject 
    <ServiceContract(Name:="ThingService")> _ 
    <CLSCompliant(True)> _ 
    Public Interface IThingService 
     ... 
    End Interface 
EndNamespace 

而且我想改變這種狀況,以

Namespace MyCompany.MyProject 
    <ServiceContract(Name:="ThingService")> _ 
    <CLSCompliant(True)> _ 
    Public Interface IThingService 
     ... 
    End Interface 
End Namespace 

,而完全不改變服務。

我試過這樣做,但是我從wsdl引用的xsds顯示了新的名稱空間名稱,這似乎是不兼容的。

任何想法?

回答

12

只要您的服務合同的名稱和(XML)名稱空間不會更改 - 當然! WCF服務真的不關心.NET內部如何實現它們。

這個工作,只要客戶端連接到使用標準Add Service Reference方法(詢問該服務的元數據來創建一個單獨的客戶端代理)服務 - 在這種情況下,客戶端代理具有沒有知識任何服務端.NET命名空間......您可以更改服務端的這些名稱並重新部署您的服務文件 - 客戶端將繼續工作。

唯一的地方,你需要做出的調整是在服務端的配置(以web.config如果你在IIS託管,在您的託管商的app.config否則):

  • <service>標籤的name=屬性有服務類的完全限定.NET類型名(包括.NET命名空間)

  • <endpoint>標籤的contract=屬性有服務合同的完全限定.NET類型名(包括.NET命名空間)

這不起作用,很明顯,如果您與服務合同共同組件 - 在這種情況下,客戶端將被捆綁到這些合同文件的.NET命名空間在一個共同的組裝和如果這些變化,客戶端將不再工作..

+0

+1爲完整答案 – vlad 2011-01-27 15:16:42

相關問題