在我正在開發的項目中,我們有幾個使用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
塊),是從服務的角度來看,會話終止的指示?如果是這樣,我應該在應用程序運行時只保留每個服務的一個實例嗎?如果問題看起來有點模糊,我很抱歉,我認爲會有很多像這樣的問題,但無法找到類似的問題。
感謝您的鏈接,但我需要一個回調方法,在會話結束時,在鏈接的例子中,方法是手動調用被自動調用。 – PoweredByOrange