我有一個實例上下文模式設置爲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數字要高得多,但只是隱藏問題有一段時間,最終一個糟糕的客戶端會使用所有的會話。我希望服務器釋放已經存在超過幾分鐘的會話,因爲沒有任何理由需要這麼長時間的服務。
有什麼建議嗎?
我必須進一步調查,但外部重新啓動服務不是一種選擇。該服務目前被託管在一個小的exe(不是IIS)中。 – 2012-03-13 21:43:14
我不知道它不是一個選項,因爲您不想結束所有會話,但可以重新啓動在Windows中運行的任何服務。 http://www.csharp-examples.net/restart-windows-service/ – evasilchenko 2012-03-14 16:42:06
對不起,澄清:取消整個服務來處理像這樣的角落案件是不是我願意做的事情。定期中斷服務的成本要遠高於成爲問題的可能性。 – 2012-03-16 15:41:42