2012-03-06 75 views
3

我有一個實例上下文模式設置爲PerCall,並使用wsHttpBinding的WCF服務。編碼不良的客戶端有能力在沒有正確釋放會話的情況下使用會話(即,客戶端不會在客戶端代理上調用Close())。通過查看「最大併發會話數百分比」性能計數器,我可以看到每個連接都會佔用一個會話,但不會釋放它。在正常,行爲良好的情況下,會話僅用於片刻,而呼叫的結果被返回。WCF:每通話會話超時

我一直在試圖找到一種方法來讓這些壞會話超時並消失,但一直不成功。由於它不是可靠的會話,因此RecieveTimeout和InactivityTimeout設置似乎沒有任何作用。這是我目前的配置,其中有一些在其設置超時的一部分,但似乎並沒有工作:

 <behaviors> 
     <serviceBehaviors> 
      <behavior name="UpdaterBehavior"> 
       <serviceMetadata httpGetEnabled="true"/> 
       <serviceCredentials> 
        <userNameAuthentication userNamePasswordValidationMode="MembershipProvider"/> 
        <serviceCertificate findValue="xxxxxx" x509FindType="FindBySubjectName"/> 
       </serviceCredentials> 
       <serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="SqlRoleProvider"/> 
       <serviceThrottling maxConcurrentCalls="10" maxConcurrentSessions="10" maxConcurrentInstances="10" />      
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <bindings> 
     <wsHttpBinding> 
      <binding name="UpdaterBinding" messageEncoding="Mtom" maxReceivedMessageSize="100000000" closeTimeout="00:01:00" openTimeout="00:01:00" 
       receiveTimeout="00:01:00" sendTimeout="00:01:00"> 
       <reliableSession ordered="true" inactivityTimeout="00:01:00" 
        enabled="false" /> 
       <readerQuotas maxArrayLength="100000000"/> 
       <security> 
        <message clientCredentialType="UserName"/> 
       </security> 
      </binding> 
     </wsHttpBinding> 
    </bindings> 

我可以設置serviceThrottling數字要高得多,但只是隱藏問題有一段時間,最終一個糟糕的客戶端會使用所有的會話。我希望服務器釋放已經存在超過幾分鐘的會話,因爲沒有任何理由需要這麼長時間的服務。

有什麼建議嗎?

回答

1

好吧,我可能完全關閉基地在這裏,但什麼我從你的問題理解爲主,這裏是一個可能的解決方案:

顯然,你可以得到活動會話的列表,但你不能終止會話從服務端:

我能想到的

http://social.msdn.microsoft.com/Forums/en/wcf/thread/a6a72bd7-bd06-43e3-8abb-d6c10432a07b

的一件事是,如果你是主辦在IIS中WCF服務,您可以創建在服務器上運行,並且在看活動會話窗口服務。也許你可以弄清楚會話建立對於服務器來說難以管理,並強迫它重新啓動IIS應用程序池?

Restarting (Recycling) an Application Pool

+0

我必須進一步調查,但外部重新啓動服務不是一種選擇。該服務目前被託管在一個小的exe(不是IIS)中。 – 2012-03-13 21:43:14

+0

我不知道它不是一個選項,因爲您不想結束所有會話,但可以重新啓動在Windows中運行的任何服務。 http://www.csharp-examples.net/restart-windows-service/ – evasilchenko 2012-03-14 16:42:06

+0

對不起,澄清:取消整個服務來處理像這樣的角落案件是不是我願意做的事情。定期中斷服務的成本要遠高於成爲問題的可能性。 – 2012-03-16 15:41:42

1

一個選項,以孤立的會話是配置的wsHttpBinding不使用依賴於會話(如可靠的消息時是多麼的服務現在配置)的任何功能。

如果您有需要可靠消息傳遞的業務需求,請轉至netMsmqBinding以獲得有保證的消息傳遞,但代價是圍繞單向消息傳遞模式進行設計。 DeviantSeev是正確的,你無法控制從服務中終止會話,但他建議的解決方案非常激烈。由於回收應用程序池造成的停機時間,因此如果您擁有像電子商務網站這樣的高容量環境,這並不是真的可行。

+0

我不認爲它配置爲可靠的消息傳遞(請注意enabled =「false」)。如果還有其他事情我需要做,以禁用可靠的消息,我不知道它。 – 2012-03-13 21:41:51

+0

對不起,錯過'enabled =「false」',我專注於'ordered =「true」'部分。作爲測試,請嘗試禁用安全性,如[論壇帖子]中所示(http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/271b1816-173c-4c76-a4c4-fd9fda4b5e91)以及從config中刪除reliableSession元素。查看該配置是否有助於解決孤兒會話問題。如果確實如此,請重新確保安全並查看問題是否恢復。如果安全是原因,那麼您需要決定禁用它是否真的是您的情況的解決方案。 – 2012-03-14 16:53:00

+0

如果我有一些空閒時間,我可以試試看看它是否有幫助。即使這樣做,但不幸的是關閉安全性並不是真正的選擇。 – 2012-03-16 15:43:43