Übersicht über zuverlässige Sitzungen

Windows Communication Foundation (WCF) SOAP zuverlässige Nachrichtenübermittlung bietet eine zuverlässige End-to-End-Nachrichtenübertragung zwischen SOAP-Endpunkten. Dies erfolgt in nicht zuverlässigen Netzwerken, indem Transportfehler und SOAP-Fehler auf Nachrichtenebene behoben werden. Insbesondere wird sitzungsbasierte, einzelne und (optional) geordnete Zustellung für Nachrichten bereitgestellt, die über SOAP- oder Transportvermittler übertragen werden. Die sitzungsbasierte Übermittlung ermöglicht die Gruppierung von Nachrichten in einer Sitzung mit optionaler Reihenfolge der Nachrichten.

Dieses Thema beschreibt zuverlässige Sitzungen, wie und wann Sie sie verwenden und wie Sie sie sichern.

Zuverlässige WCF-Sitzungen

In WCF sind zuverlässige Sitzungen eine Implementierung von zuverlässigem SOAP-Messaging, wie im WS-ReliableMessaging-Protokoll definiert.

Zuverlässiges WCF SOAP-Messaging bietet eine zuverlässige End-to-End-Übertragung zwischen zwei Endpunkten, unabhängig von der Anzahl oder dem Typ der Vermittler, durch die die Messagingendpunkte getrennt werden. Dies umfasst alle Transportvermittler, die kein SOAP (z. B. HTTP-Proxys) verwenden, oder Vermittler, die SOAP (z. B. SOAP-basierte Router oder Brücken) verwenden, und die für die Übertragung von Nachrichten zwischen den Endpunkten erforderlich sind. Ein zuverlässiger Sitzungskanal unterstützt interactive Kommunikation, sodass die über einen solchen Kanal verbundenen Dienste gleichzeitig ausgeführt werden können und mit geringer Latenz, also in relativ geringen Zeitintervallen, Nachrichten austauschen und verarbeiten können. Diese Kopplung bedeutet, dass diese Komponenten zusammen weiterarbeiten oder zusammen fehlschlagen; sie sind also nicht voneinander isoliert.

Eine zuverlässige Sitzung maskiert zwei Arten von Fehlern:

  • SOAP-Fehler auf Nachrichtenebene, zu denen verloren gegangene oder doppelte Nachrichten gehören sowie Nachrichten, die in einer anderen Reihenfolge eintreffen als der, in der sie gesendet wurden.

  • Transportfehler.

Eine zuverlässige Sitzung implementiert das WS-ReliableMessaging-Protokoll und ein Übertragungsfenster im Arbeitsspeicher, um SOAP-Fehler auf Nachrichtenebene zu maskieren und Verbindungen im Falle von Transportfehlern neu herzustellen.

Eine zuverlässige Sitzung stellt für SOAP-Nachrichten das bereit, was TCP für IP-Pakete bereitstellt. Eine TCP-Socketverbindung stellt eine einzelne, geordnete Übertragung von IP-Paketen zwischen Knoten bereit. Der zuverlässige Kanal stellt denselben Typ zuverlässiger Übertragung bereit, die sich aber von der TCP-Socket-Zuverlässigkeit in folgenden Punkten unterscheidet:

  • Die Zuverlässigkeit gilt für die SOAP-Nachrichten-Ebene, nicht für ein Byte-Paket zufälliger Größe.

  • Die Zuverlässigkeit ist transportneutral, nicht nur für die Übertragung über TCP.

  • Die Zuverlässigkeit ist nicht an eine bestimmte Transportsitzung gebunden (beispielsweise an die Sitzung, die eine TCP-Verbindung bereitstellt) und kann während der Lebensdauer einer zuverlässigen Sitzung mehrere Transportsitzungen gleichzeitig oder nacheinander verwenden.

  • Die zuverlässige Sitzung besteht zwischen den sendenden und den empfangenden SOAP-Endpunkten, unabhängig von der Anzahl der Transportverbindungen, die für die Konnektivität zwischen ihnen erforderlich ist. Kurz gesagt, TCP-Zuverlässigkeit endet, wo die Transportverbindung endet, wohingegen eine zuverlässige Sitzung End-to-End-Zuverlässigkeit bereitstellt.

Zuverlässige Sitzungen und Bindungen

Wie bereits erwähnt, ist eine zuverlässige Sitzung transportneutral. Außerdem können Sie eine verlässliche Sitzung über viele Nachrichtenaustauschmuster aufbauen, z. B. Anforderung-Antwort oder Duplex. Eine verlässliche WCF-Sitzung wird als Eigenschaft einer Gruppe von Bindungen dargestellt.

Benutzen Sie eine zuverlässige Sitzung auf Endpunkten, die:

  • HTTP-basierte Transport-Standardbindungen:

    • WsHttpBinding und verfügbar gemachte Anforderung-Antwort- oder unidirektionale Verträge.

    • Wenn Sie eine zuverlässige Sitzung über einen Anfrage-Antwort- oder einen einfachen einseitigen Dienstvertrag verwenden.

    • WsDualHttpBinding und verfügbar gemachte Duplex-, Anforderung-Antwort- oder unidirektionale Verträge.

    • WsFederationHttpBinding und verfügbar gemachte Anforderung-Antwort- oder unidirektionale Verträge.

  • TCP-basierte Transport-Standardbindungen:

    • NetTcpBinding und verfügbar gemachte Duplex-, Anforderung-Antwort- oder unidirektionale Verträge.

Verwenden Sie eine zuverlässige Sitzung für alle anderen Bindungen, indem Sie eine benutzerdefinierte Bindung erstellen, z. B. HTTPS (weitere Informationen zu Problemen finden Sie unter Zuverlässige Sitzungen und Sicherheit) oder eine benannte Pipe-Bindung.

Sie können eine zuverlässige Sitzung auf verschiedene zugrundeliegende Kanaltypen stapeln, wodurch sich die Kanalform der zuverlässigen Sitzung ändert. Sowohl beim Client als auch beim Server hängt der Typ des unterstützten zuverlässigen Sitzungskanals vom Typ des zugrunde liegenden Kanals ab, der verwendet wird. In der folgenden Tabelle werden die Typen von Sitzungskanälen aufgeführt, die vom Client auf der Basis des zugrunde liegenden Kanaltyps unterstützt werden.

Unterstützte zuverlässige Sitzungskanaltypen† IRequestChannel IRequestSessionChannel IDuplexChannel IDuplexSessionChannel
IOutputSessionChannel Ja Ja Ja Ja
IRequestSessionChannel Ja Ja Nr. Nr.
IDuplexSessionChannel Nr. Nein Ja Ja

†Die unterstützten Kanaltypen sind die verfügbaren Werte für den generischen TChannel-Parameterwert, der an die BuildChannelFactory<TChannel>(BindingContext)-Methode übergeben wird.

In der folgenden Tabelle werden die Typen von Sitzungskanälen aufgeführt, die vom Server auf der Basis des zugrunde liegenden Kanaltyps unterstützt werden.

Unterstützte zuverlässige Sitzungskanaltypen‡ IReplyChannel IReplySessionChannel IDuplexChannel IDuplexSessionChannel
IInputSessionChannel Ja Ja Ja Ja
IReplySessionChannel Ja Ja Nr. Nr.
IDuplexSessionChannel Nr. Nein Ja Ja

‡Die unterstützten Kanaltypen sind die verfügbaren Werte für den generischen TChannel-Parameterwert, der an die BuildChannelListener<TChannel>(BindingContext)-Methode übergeben wird.

Zuverlässige Sitzungen und Sicherheit

Der Schutz einer zuverlässigen Sitzung ist wichtig, um sicherstellen zu können, dass die Kommunikationspartner (Dienst und Client) authentifiziert und die in der Sitzung ausgetauschten Nachrichten nicht verfälscht werden. Weiterhin ist es wichtig, die Integrität jeder einzelnen zuverlässigen Sitzung sicherzustellen. Eine zuverlässige Sitzung wird geschützt, indem sie an einen sicheren Kontext gebunden wird, der vom Sicherheitskanal der Sitzung dargestellt und verwaltet wird. Der Sicherheitskanal stellt eine Sicherheitssitzung bereit. Die Sicherheitstoken, die während der Einrichtung der Sitzung ausgetauscht werden, werden anschließend verwendet, um die Nachrichten in der zuverlässigen Sitzung zu schützen.

Wenn eine zuverlässige Sitzung über TCP-S läuft, wird die TCP-Sitzung an die zuverlässige Sitzung gebunden. Die Transportsicherheit gewährleistet daher, dass die Sicherheit auch an die zuverlässige Sitzung gebunden ist. In diesem Fall ist die erneute Einrichtung einer Verbindung abgeschaltet.

Die einzige Ausnahme besteht bei der Verwendung von HTTPS. Die Secure Sockets Layer (SSL)-Sitzung ist nicht an die zuverlässige Sitzung gebunden. Dies stellt ein Risiko dar, weil Sitzungen, die einen Sicherheitskontext gemeinsam verwenden (die SSL-Sitzung), nicht voreinander geschützt sind. Dies kann, abhängig von der Anwendung, ein echtes Risiko darstellen oder auch nicht.

Verwenden von zuverlässigen Sitzungen

Um zuverlässige WCF-Sitzungen zu verwenden, erstellen Sie einen Endpunkt mit einer Bindung, die eine zuverlässige Sitzung unterstützt. Verwenden Sie eine der von WCF bereitgestellten Bindungen mit aktivierter zuverlässiger Sitzung, oder erstellen Sie eine eigene benutzerdefinierte Bindung, die dies tut.

Die systemdefinierten Bindungen, die standardmäßig eine zuverlässige Sitzung unterstützen und aktivieren, sind:

Die systemdefinierten Bindungen, die optional eine zuverlässige Sitzung unterstützen, sie jedoch nicht standardmäßig aktivieren, sind:

Ein Beispiel für die Erstellung einer benutzerdefinierten Bindung finden Sie unter Vorgehensweise: Erstellen einer benutzerdefinierten zuverlässigen Sitzungsbindung mit HTTPS.

Eine Diskussion über WCF-Bindungen, die zuverlässige Sitzungen unterstützen, finden Sie unter Systembereitgestellte Bindungen.

Wann zuverlässige Sitzungen verwendet werden

Es ist wichtig zu wissen, wann Sie in Ihrer Anwendung zuverlässige Sitzungen verwenden sollten. WCF unterstützt zuverlässige Sitzungen zwischen Endpunkten, die gleichzeitig aktiv und gültig sind. Wenn es für Ihre Anwendung erforderlich ist, dass einer der Endpunkte für eine gewisse Zeit nicht verfügbar ist, dann verwenden Sie Warteschlangen, um Zuverlässigkeit zu erreichen.

Wenn das Szenario zwei Endpunkte erfordert, die über TCP verbunden sind, dann kann TCP ausreichend sein, um einen zuverlässigen Nachrichtenaustausch zu gewährleisten. Es ist allerdings nicht notwendig, eine zuverlässige Sitzung zu verwenden, da TCP sicherstellt, dass die Pakete in der richtigen Reihenfolge und nur einmal ankommen.

Weist Ihr Szenario eines der folgenden Merkmale auf, müssen Sie ernsthaft erwägen, eine zuverlässige Sitzung zu verwenden.

  • SOAP-Vermittler, z. B. SOAP-Router

  • Proxyvermittler oder Transportbrücken

  • Zeitweilige Konnektivität

  • Sitzungen über HTTP

Siehe auch