3 Stimmen

WCF: Zeitüberschreitung für Sitzungen pro Aufruf

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?

1voto

evasilchenko Punkte 1862

Okay, vielleicht liege ich hier völlig daneben, aber basierend auf dem, was ich von Ihrer Frage verstanden habe, ist hier eine mögliche Lösung:

Offenbar können Sie eine Liste der aktiven Sitzungen abrufen, aber Sie können die Sitzung nicht von der Dienstseite aus beenden:

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

Wenn Sie den WCF-Dienst in IIS hosten, können Sie einen Windows-Dienst erstellen, der auf dem Server läuft und die aktiven Sitzungen anzeigt. Vielleicht können Sie herausfinden, wann der Sitzungsaufbau für den Server nicht mehr zu bewältigen ist und ihn zwingen, den IIS-Anwendungspool neu zu starten?

Neustart (Recycling) eines Anwendungspools

1voto

Sixto Saez Punkte 12515

Eine Option für die verwaisten Sitzungen ist es, die wsHttpBinding so zu konfigurieren, dass keine Funktionen verwendet werden, die von Sitzungen abhängen (wie z. B. die zuverlässige Nachrichtenübermittlung, wie der Dienst jetzt konfiguriert ist).

Wenn Sie einen geschäftlichen Bedarf haben, der zuverlässiges Messaging erfordert, gehen Sie zu netMsmqBin

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X