2010-11-13 59 views
0

我使用net.tcp和netTcpBinding將WCF服務放在一起,以便與我的Silverlight客戶端獲得雙工通信。我從Silverlight應用程序調用服務,服務調用另一個服務器,並在WCF服務類中傳遞一個回調方法。遠程服務器多次回呼,每次執行時,WCF服務使用callbackchannel將數據發送給Silverlight客戶端。大部分時間它都可以很好地工作。如何檢查使用net.tcp進行雙工的Silverlight客戶端的連接是否仍然有效?

如果用戶輸入一個很大的請求,在大量的回調已經工作後,我會得到一個TimeoutException。 (顯然,在其他地方有一些工作需要阻止,但我想先搶先服務。)

我曾期待在某種'if(client.ConnectionState == faulted)'檢查之前檢查試圖回調到Silverlight客戶端,但我似乎無法找到保存連接狀態的對象。有一個嗎?我是否從錯誤的一面接近了這一點?

這是我第一次投入服務net.tcp和雙工。我剛搬家,我的WCF聖經仍然在一個盒子裏。某處。 :-)所以,我不能做我平常的背景閱讀。

任何指針都會被感激地收到。下面是一些裸露的代碼的情況下我的描述過於糊狀:

private IActiveDirectoryClient client; 
    private AsyncSearchRunner runner; 

    public void Search(Request request) 
    { 
     this.client = OperationContext.Current.GetCallbackChannel<IActiveDirectoryClient>(); 

     runner = new AsyncSearchRunner(); 
     runner.Run(request.SearchRoot, request.SearchFilter, request.PageSize, 
      System.DirectoryServices.Protocols.SearchScope.Subtree, SendObjects); 
    } 

    private void SendObjects(List<DirectoryObject> items) 
    { 
     Response response = new Response(); 
     response.DirectoryObjects = items.ToArray(); 

     client.SendResponse(response); 
    } 

回答

0

是的,有是在ClientBase<>類(所有的代理類是從ClientBase<>派生)定義的State屬性。

有一些代理包裝處理連接的故障狀態並根據需要重新建立連接。谷歌爲「wcf代理包裝」。

如果您使用某種ServiceLocator模式,也可以在家中自制東西。