2014-01-08 108 views
3

我有一個WCF服務,它對於常規的客戶端 - >服務器調用來說工作得非常好。然而,我試圖向服務中引入一個簡單的回調函數,但它不起作用......最終我不確定我出錯的地方,所以讓我告訴你設置並告訴你我所知道的。WCF回調沒有在客戶端調用並掛在服務器端

1)合同

public interface IPIRSCallbackService 
{ 
    [OperationContract] 
    void OnCallback(); 
} 

[ServiceContract(CallbackContract = typeof(IPIRSCallbackService))] 
public interface IPIRSService 
{ etc... 

2)服務器合同執行

注:我檢查回調通道的狀態,它是「打開」 - 不知道有多少,這是值得雖然。

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)] 
class PIRSService : IPIRSService 
{ 

    public PIRSService() 
    { 
     callback = OperationContext.Current.GetCallbackChannel<IPIRSCallbackService>(); 
     var x = ((ICommunicationObject)callback).State; 
     callback.OnCallback(); // HANGS HERE 
    } 
    etc. 

3)客戶端 - 創建代理

現在,這可能不是你會看到,因爲我用的是ViewModelLocator注入服務爲我的ViewModels常見的方式......但我相信這不會引起問題...並注意正常的服務調用工作絕對正常。

ViewModelLocator註冊連接到該服務的服務實例

 SimpleIoc.Default.Register<PIRSService>(() => 
      { 
       IPIRSCallbackService callback = new PIRSCallbackService(); 
       InstanceContext context = new InstanceContext(callback); 
       return new PIRSService(context, "PIRSClient"); 
      }, true); 

     SimpleIoc.Default.Register<IPIRSService>(() => 
      { 
       return SimpleIoc.Default.GetInstance<PIRSService>(); 
      }, true); 

4)

DuplexChannelFactory<IPIRSService> channelFactory = new DuplexChannelFactory<IPIRSService>(callbackContext, endpointConfigName); 
    channelFactory.Credentials.UserName.UserName = userName; 
    channelFactory.Credentials.UserName.Password = password; 
    proxy = channelFactory.CreateChannel(); 
    ((IClientChannel)proxy).Open(); 

5)客戶端 - 端點配置

<endpoint address="net.tcp://localhost:20437/PIRSService" binding="netTcpBinding" 
    bindingConfiguration="StandardNetTcpBinding" contract="PIRS_Common.Service.IPIRSService" 
    name="PIRSClient" kind="" endpointConfiguration="" behaviorConfiguration="CustomBehavior"> 
    <identity> 
     <dns value="WCfServer" /> 
    </identity> 
    </endpoint> 

所以,我不知道爲什麼回調協議的客戶端實現不會被觸發......因此服務器sid呼叫回調方法掛在呼叫上......因爲它正在等待回調完成。我相信這是一個回調未被正確註冊的問題......但我不確定我做錯了什麼。我是否需要在客戶端端點或其他地方註冊回調合同?

回答

5

您可以確保將「ConcurrencyMode.Multiple」添加到實現回調的類的「CallbackBehavior」屬性中。

[CallbackBehavior(ConcurrencyMode=ConcurrencyMode.Multiple)] 

回調ConcurrencyMode參考:
http://blogs.msdn.com/b/dsnotes/archive/2013/09/18/wcf-callback-operations-are-invoked-sequentially.aspx

另外,如果你還沒有,你可能要考慮啓用WCF跟蹤,以確保服務器實際上調用客戶端回調方法。

WCF跟蹤參考: http://msdn.microsoft.com/en-us/library/ms733025.aspx

+0

謝謝您的指針!我在客戶端和服務器端啓用了跟蹤,並且記錄了服務器發送回調並且客戶端收到回調請求...並且在該點之後沒有任何其他記錄!我不知道發生了什麼,因爲我確定必須正確建立連接,以便將消息發送給客戶端......但爲什麼合同方法不會被解僱?如果我發佈日誌會有用嗎?因爲我可能會錯過一些東西! – Sam

+0

有趣的是...回調請求是在客戶端處理的,但是它沒有達到實際執行請求的點...不確定哪個不會發生!記錄在活動中的最後一個階段是「安全協議驗證傳入消息」...我知道這可能看起來像是一個安全問題......但聲明確實意味着該消息已被成功驗證!但說實話,我不知道現在該去哪裏...任何指導將不勝感激! – Sam

+0

我不確定問題出在哪裏,所以也許你可以確認或更正下面的簡單流程流程語句:客戶端 - >服務器 - >回調 - 錯誤 - >客戶端 – Seymour

相關問題