2017-04-24 65 views
1

我正在學習WCF,作爲學習的一部分,我發現合約的命名空間應該匹配。我寫了一個合同類(客戶端和主機都有自己的副本),並使其名稱空間不匹配,但我的代碼仍然有效。我爲合同和主持人類以及客戶如何調用合同提供了代碼。有人能告訴我哪裏錯了嗎?合同名稱空間 - 沒有衝突,爲什麼?

客戶合同類:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.ServiceModel; 
using System.Text; 
using System.Threading.Tasks; 

namespace GeoLib.Client.Contracts 
{ 
    [ServiceContract] 
public interface IMessageContract 
{ 
    [OperationContract (Name = "ShowMessage")] 
    void ShowMsg(string message); 
} 
} 

主合同類:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.ServiceModel; 
using System.Text; 
using System.Threading.Tasks; 

namespace GeoLib.WindowsHost.Contracts 
{ 
[ServiceContract] 
public interface IMessageContract 
{ 
    [OperationContract] 
    void ShowMessage(string message); 
} 
} 

長途區號的客戶:

private void btnMakeCall_Click(object sender, RoutedEventArgs e) 
    { 
     ChannelFactory<IMessageContract> factory = new ChannelFactory<IMessageContract>(""); 
     IMessageContract proxy = factory.CreateChannel(); 

     proxy.ShowMsg(txtMessage.Text); 

     factory.Close(); 
    } 

回答

1

在ServiceContracts或DataContracts Namespace通常used for versioning因爲它們允許兩個具有相同名稱的對象不同nt命名空間。

但是,您似乎沒有爲您的服務定義名稱空間。

定義命名空間會是這樣:

[ServiceContract (Namespace="http://yourcompany.com/MyService/V1")] 
public interface IMessageContract 
{ 
    ... 
} 

如果以後推出帶有新的實現你的服務的一個新版本,並把它放在一個單獨的命名空間,如:

[ServiceContract (Namespace="http://yourcompany.com/MyService/V2")] 
    public interface IMessageContract 
    { 
     ... 
    } 

那麼你可以保持兩個服務分開,讓舊客戶端調用版本1和新客戶端調用版本2

+0

我正在學習Miguel Castro的Pluralsight上的WCF課程,他建議t他有理由使用名稱空間屬性,就像您建議在不共享合同並讓主機和客戶端使用自己的合同時停止命名空間衝突一樣。 – Baahubali