Empfohlene Vorgehensweisen für zuverlässige Sitzungen
In diesem Thema werden empfohlene Vorgehensweisen für zuverlässige Sitzungen erläutert.
Festlegen von MaxTransferWindowSize
Zuverlässige Sitzungen in Windows Communication Foundation (WCF) verwenden ein Übertragungsfenster, um Nachrichten auf dem Client und Dienst zu halten. Der konfigurierbare Eigenschaft MaxTransferWindowSize gibt an, wie viele Nachrichten das Übertragungsfenster speichern kann.
Für den Sender gibt diese Eigenschaft an, wie viele Nachrichten das Übertragungsfenster während des Wartens auf Bestätigungen speichern kann; für den Empfänger gibt diese Eigenschaft an, wie viele Nachrichten des Diensts gepuffert werden.
Die Auswahl der richtigen Größe wirkt sich auf die Effizienz des Netzwerks und die optimale Kapazität des Dienstes aus. Die folgenden Abschnitte erläutern im Einzelnen, was bei der Auswahl des Werts dieser Eigenschaft berücksichtigt werden muss, und welche Auswirkungen dieser Wert hat.
Die Standardgröße des Übertragungsfensters ist acht Nachrichten.
Effiziente Verwendung des Netzwerks
In diesem Zusammenhang entspricht der Begriff Netzwerk allem, was als Grundlage der Kommunikation zwischen einem Client (Absender) und einem Dienst (Empfänger) verwendet wird. Dies schließt die Transportverbindungen und alle dazwischen liegenden Vermittler oder Brücken ein, einschließlich SOAP-Routern oder HTTP-Proxys und -Firewalls.
Die effiziente Verwendung des Netzwerks stellt sicher, dass die Netzwerkkapazität vollständig ausgeschöpft wird. Sowohl die Datenmenge, die pro Sekunde über das Netzwerk übertragen werden kann (Datenrate) sowie die Zeit, die benötigt wird, um Daten vom Sender zum Empfänger zu übermitteln (Latenz) wirken sich darauf aus, wie effizient das Netzwerk verwendet wird.
Für die sendende Seite gibt die Eigenschaft MaxTransferWindowSize an, wie viele Nachrichten das Übertragungsfenster während des Wartens auf Bestätigungen speichern kann. Ist daher die Netzwerklatenz hoch, sollten Sie die Größe des Übertragungsfensters erhöhen, um reaktionsschnelles Senden und effiziente Verwendung das Netzwerks sicherzustellen.
Auch wenn der Sender beispielsweise mit der Datenrate Schritt hält, könnte die Latenz hoch sein, wenn in einem Netzwerk zahlreiche Vermittler zwischen Sender und Empfänger vorhanden sind, oder wenn es bei einem Vermittler bzw. im Netzwerk zu Datenverlusten kommt. Daher muss der Sender auf Bestätigungen für die Nachrichten in seinem Übertragungsfenster warten, bevor er weitere Nachrichten senden kann. Je kleiner der Puffer bei hoher Latenz, desto weniger effizient ist die Netzwerkverwendung. Andererseits kann sich ein zu großes Übertragungsfenster negativ auf den Dienst auswirken, weil der Dienst mit der hohen Senderate des Clients Schritt halten muss.
Ausführen des Diensts entsprechend der Kapazität
Wird das Netzwerk effizient genutzt, möchten Sie, dass auch der Dienst idealerweise mit optimaler Kapazität ausgeführt wird. Die Eigenschaft für die Größe des Übertragungsfensters beim Empfänger gibt an, wie viele Nachrichten der Empfänger puffern kann. Diese Nachrichtenpufferung hilft nicht nur der Flusssteuerung im Netzwerk, sondern erlaubt dem Client auch, mit voller Kapazität zu laufen. Ist zum Beispiel eine Nachricht als Puffergröße festgelegt, und die Nachrichten treffen schneller ein, als sie der Client verarbeiten kann, verwirft das Netzwerk möglicherweise Nachrichten, und Netzwerkkapazität wird verschwendet oder unzureichend ausgenutzt.
Die Verwendung eines Puffers erhöht die Verfügbarkeit des Diensts, weil er Nachrichten empfangen und puffern kann, während er gleichzeitig vorher empfangene Nachrichten verarbeitet.
Es wird empfohlen, für den Sender und den Empfänger den gleichen MaxTransferWindowSize
-Wert für die Eigenschaft zu verwenden.
Aktivieren der Flusssteuerung
Die Flusssteuerung ist ein Mechanismus, der sicherstellt, dass Sender und Empfänger miteinander Schritt halten, dass also die Nachrichten so schnell verarbeitet und beantwortet werden, wie sie erstellt wurden. Eine vernünftige Größe des Übertragungsfensters von Client und Dienst stellt sicher, dass Sender und Empfänger ausreichend synchron arbeiten.
Es wird dringend empfohlen, die Eigenschaft FlowControlEnabled auf true
festzulegen, wenn Sie eine zuverlässige Sitzung zwischen einem WCF-Client und einem WCF-Dienst verwenden.
Festlegen von MaxPendingChannels
Wenn Sie einen Dienst schreiben, der für die Kommunikation mit verschiedenen Clients zuverlässige Sitzungen verwendet, ist es möglich, dass mehrere Clients gleichzeitig eine zuverlässige Sitzung mit dem Dienst einrichten. Die Antwort des Diensts hängt in diesen Fällen von der MaxPendingChannels
-Eigenschaft ab.
Wenn der Sender einen zuverlässige Sitzungskanal zum Empfänger erstellt, dann begründet ein Handshake zwischen ihnen eine zuverlässige Sitzung. Ist die zuverlässige Sitzung eingerichtet, wird der Kanal für seine Annahme durch den Dienst in eine Warteschlange ausstehender Kanäle eingereiht. Die MaxPendingChannels
-Eigenschaft gibt an, wie viele Kanäle in diesem Zustand sein können.
Es ist möglich, dass sich der Dienst in einem Zustand befindet, in dem er keine weiteren Kanäle annehmen kann. Ist die Warteschlange voll, wird der Versuch, eine zuverlässige Sitzung einzurichten, zurückgewiesen. Der Client muss dies dann erneut versuchen.
Es ist auch möglich, dass die sich in der Warteschlange befindenden Kanäle für längere Zeit dort verbleiben. In der Zwischenzeit könnte bei der zuverlässigen Sitzung ein Inaktivitäts-Timeout auftreten, wodurch der Kanal in einen Fehlerzustand übergeht.
Daher sollten Sie, wenn Sie einen Dienst schreiben, der mehrere Clients gleichzeitig bedient, einen Wert wählen, der Ihren Anforderungen entspricht. Ein zu hoher Wert der MaxPendingChannels
-Eigenschaft behindert Ihren Arbeitssatz.
Der Standardwert für MaxPendingChannels ist vier Kanäle.
Zuverlässige Sitzungen und Hosting
Wenn Sie Webhosting für einen Dienst mit zuverlässigen Sitzungen verwenden, sollten Sie sich immer an die folgenden wichtigen Überlegungen halten:
Zuverlässige Sitzungen sind zustandsbehaftet, und der Zustand wird in der AppDomain beibehalten. Dies bedeutet, dass alle Nachrichten, die Teil einer zuverlässigen Sitzung sind, in der gleichen AppDomain verarbeitet werden müssen. Webfarmen und Webgärten, bei denen die Größe der Farm oder des Gartens größer als ein Knoten ist, kann diese Einschränkung nicht garantieren.
Bei zuverlässigen Sitzungen, die duale HTTP-Kanäle (beispielsweise mit
WsDualHttpBinding
) verwenden, können mehr HTTP-Verbindungen als der Standardwert 2 pro Client erforderlich sein. Das bedeutet, dass eine zuverlässige Duplexsitzung bis zu zwei Verbindungen in jede Richtung erfordern kann, weil gleichzeitig ausgeführte Anwendungen und Protokollnachrichten über jeden Weg und zu jeder Zeit Übertragungen vornehmen. Dies bedeutet, dass unter gewissen Bedingungen, die vom Nachrichtenaustauschmuster des Diensts abhängen, ein Deadlock bei einem im Internet gehosteten Dienst auftritt, der duale HTTP-Verbindungen und zuverlässige Sitzungen verwendet. Fügen Sie, um die Zahl der zulässigen HTTP-Verbindungen pro Client zu erhöhen, Folgendes in die entsprechende Konfigurationsdatei ein (beispielsweise in die Datei web.config des jeweiligen Diensts):<configuration> <system.net> <connectionManagement> <add name="*" maxconnection="4" /> </connectionManagement> </system.net> </configuration>
Der Wert des
maxconnection
-Attributs ist die Anzahl der erforderlichen Verbindungen. Das Minimum in diesem Fall sollte vier Verbindungen sein.