Ich habe einen WCF-Dienst mit dem Instanzkontextmodus auf PerCall festgelegt, und verwenden Sie die wsHttpBinding. Ein schlecht codierter Client hat die Möglichkeit, Sitzungen zu verbrauchen, ohne sie ordnungsgemäß freizugeben (d. h. der Client ruft Close() auf dem Client-Proxy nicht auf). Wenn ich mir den Leistungszähler "Percent of Max Concurrent Sessions" ansehe, kann ich sehen, dass jede Verbindung eine Sitzung verbraucht und nicht freigibt. Unter normalen Umständen wird die Sitzung nur für ein paar Augenblicke verwendet, während die Ergebnisse des Aufrufs zurückgegeben werden.
Ich habe versucht, einen Weg zu finden, wie ich diese fehlerhaften Sitzungen dazu bringen kann, eine Zeitüberschreitung zu verursachen und zu verschwinden, aber ich hatte keinen Erfolg. Da es sich nicht um eine zuverlässige Sitzung handelt, scheinen die Einstellungen RecieveTimeout und InactivityTimeout keine Wirkung zu haben. Hier ist ein Teil meiner aktuellen Konfiguration, in der eine Reihe von Zeitüberschreitungen eingestellt sind, die aber nicht zu funktionieren scheinen:
<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>
Ich kann die serviceThrottling-Zahlen viel höher setzen, aber das verdeckt das Problem nur für eine Weile, und schließlich würde ein schlechter Client alle Sitzungen aufbrauchen. Ich möchte, dass der Server jede Sitzung freigibt, die länger als ein paar Minuten dauert, da es keinen Grund gibt, warum irgendetwas bei diesem Dienst so lange dauern sollte.
Irgendwelche Vorschläge?