2013-07-18 108 views
0

在我正在開發的項目中,我們有幾個使用WCF實現的服務。我面對的情況是,某些服務需要知道會話何時結束,以便它可以適當地更新該客戶端的狀態。當客戶端正常終止時(例如,用戶關閉應用程序),通知服務很容易,但是,有些情況下應用程序可能會崩潰,或客戶端計算機可能會重新啓動,在這種情況下,客戶端將無法通知關於其狀態的服務。WCF - 確定會話何時在服務器端結束

最初,我一直在考慮在服務器端有一個定時器,一旦客戶端連接就會觸發定時器,並在1分鐘後將該客戶端的狀態更改爲「終止」。現在,客戶端每30秒向服務發送一次狀態,並且服務基本上會在客戶端的每個請求中重新啓動計時器,這意味着只要客戶端處於活動狀態,它(希望)不會更改客戶端的狀態。

即使此方法非常可靠(不完全可靠;如果客戶端發送狀態超過1分鐘,該怎麼辦?),但它仍不是解決此問題的最佳方法。請注意,由於系統的原始設計,我無法實現雙工服務,這可能會使事情變得更簡單。所以我的問題是:有沒有辦法讓服務知道會話何時結束(即連接超時或客戶端關閉代理)?我來到這個問題:WCF: How to find out when a session is ending但答案的鏈接似乎被打破。

我擔心的另一件事是;他們的方式,我目前正在創建我的頻道代理實現這樣的:

internal static TResult ExecuteAndReturn<TProxy, TResult>(Func<TProxy, TResult> delegateToExecute) 
    { 
     string endpointUri = ServiceEndpoints.GetServiceEndpoint(typeof(TProxy)); 

     var binding = new WSHttpBinding(); 
     binding.Security.Mode = SecurityMode.Message; 
     binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName; 

     TResult valueToReturn; 

     using (ChannelFactory<TProxy> factory = new ChannelFactory<TProxy>(binding, 
                       new EndpointAddress(new Uri(endpointUri), 
                       EndpointIdentity.CreateDnsIdentity(ServiceEndpoints.CertificateName)))) 
     { 
      TProxy proxy = factory.CreateChannel(); 

      valueToReturn = delegateToExecute(proxy); 
     } 

     return valueToReturn; 
    } 

所以服務調用後作出通道被立即關閉(因爲它是在一個using塊),是從服務的角度來看,會話終止的指示?如果是這樣,我應該在應用程序運行時只保留每個服務的一個實例嗎?如果問題看起來有點模糊,我很抱歉,我認爲會有很多像這樣的問題,但無法找到類似的問題。

回答

0

是,關閉通道終止會話,但如果有某種類型的錯誤,那麼你受的服務超時設置,就像這樣:

<binding name="tcpBinding" receiveTimeout="00:00:10" /> 

這引入了十秒時間如果發生錯誤。

退房Managing WCF Session Lifetime with IsInitiating and IsTerminating

+0

感謝您的鏈接,但我需要一個回調方法,在會話結束時,在鏈接的例子中,方法是手動調用被自動調用。 – PoweredByOrange