2012-12-21 22 views
1

我無法將服務添加到實現兩個合同的app.config,因此需要兩個端點。從具有兩個合同和端點的服務創建代理

見這個問題對於我試圖做一個簡單的例子:

WCF config for a service class implementing multiple contracts on separate endpoints

我真的想用在我的客戶服務參考,以創建和維護的代理我,但是當我嘗試用兩個端點與服務做到這一點,我得到的信息出現以下錯誤時它會嘗試下載元數據:

元數據包含無法解析

參考

這裏是我如何在我的app.config服務建立在我的WCF服務庫的例子:

<service name="MyService"> 
    <endpoint address="Address1" binding="wsDualHttpBinding" bindingConfiguration="" 
     name="Service1" contract="IService1" /> 
    <endpoint address="Address2" binding="wsDualHttpBinding" bindingConfiguration="" 
     name="Service2" contract="IService2" /> 
    <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="" 
     name="mex" contract="IMetadataExchange" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://localhost:8732/Design_Time_Addresses/MyService/" /> 
     </baseAddresses> 
    </host> 
    </service> 

我覺得我失去了一些東西簡單。當我刪除其中一個端點時,一切正常。但是如果我有兩個端點,它不能解析元數據。

我試圖去除基地址,並使用詳細地址,並用不同的端口,但我已經嘗試導致同樣的錯誤的所有路徑。


編輯: 我要澄清爲什麼我試圖做到這一點首先,我猜。我有一個單一的服務,我希望客戶能夠連接到。但有一些方法我不希望客戶有權訪問。我認爲將管理方法和客戶端方法分成兩個單獨的合同是一個好的開始。

更加清楚的是,這是一款遊戲服務器。我希望能夠啓動遊戲服務器的新實例並將其發送給地圖等。 我不希望玩家有權訪問LoadMap()或類似的東西。 我真的很想將遊戲客戶端的方法和回調與製作服務或服務器管理員的方法和回調分開。

我也想他們是單獨的合同只是爲了更容易閱讀和維護。

但是,如果有更好的方法來做到這一點,我很樂意提供建議。

+0

IService2是否存在?你爲了使它工作而刪除了哪一個? – meanbunny

+0

是的,兩者都存在,我可以從WCF服務庫的app.config中刪除任一端點,並且客戶端中的服務引用會找到我沒有刪除的端點。我通過創建一個默認的WCF服務庫再次嘗試了它。然後我添加了一個帶有ServiceContract屬性的接口,並在我的服務中實現了該接口,並設置了與我發佈的類似的WCF配置。我使用默認的wsHttpBinding,並在我的測試客戶端試圖解析服務引用時得到相同的結果。 – Mike

回答

0

花了我一會兒才弄明白這一點。我撕毀了我的項目,並開始重建它,直到它破裂。

顯然,你不能在你的回調契約具有相同名稱的兩個回調方法,如果你嘗試這樣做。

例子:

public interface IService1Callback 
{ 
    [OperationContract(IsOneWay = true)] 
    void GetDataDone(); 
} 

public interface IService2Callback 
{ 
    [OperationContract(IsOneWay = true)] 
    void GetDataDone(); 
} 

如果再設置這些爲您服務合約的回調契約是這樣的:

[ServiceContract 
(Namespace = "ServiceLib", 
SessionMode = SessionMode.Required, CallbackContract = typeof(IService1Callback))] 
public interface IService1 
{ 
    [OperationContract(IsInitiating = true)] 
    string GetData(int value); 
} 

[ServiceContract 
(Namespace = "ServiceLib", 
SessionMode = SessionMode.Required, CallbackContract = typeof(IService2Callback))] 
public interface IService2 
{ 
    [OperationContract(IsInitiating = true)] 
    string GetOtherData(int value); 
} 

你最終會得到我在我原來的問題中提到的錯誤。

我認爲這是因爲終點無法確定該方法來自哪個回調契約,因爲它們具有相同的名稱,所以元數據無法解析引用。

幸運的是我不會有同名的回調,但我被困在這一段時間,因爲我剛剛設置了一些虛擬方法來讓事情順利進行。

相關問題