Benutzerdefinierte Stream-UpgradesCustom Stream Upgrades

Streamorientierte Transports wie TCP und benannte Pipes werden auf einem fortlaufenden Bytestream zwischen Client und Server ausgeführt.Stream-oriented transports such as TCP and Named Pipes operate on a continuous stream of bytes between the client and server. Dieser Stream wird durch ein Stream-Objekt realisiert.This stream is realized by a Stream object. Bei einem Stream-Upgrade will der Client dem Kanalstapel eine optionale Protokollebene hinzufügen und fordert das andere Ende des Kommunikationskanals dazu auf.In a stream upgrade, the client wants to add an optional protocol layer to the channel stack, and asks the other end of the communication channel to do so. Das Stream-Upgrade besteht aus dem Ersetzen des ursprünglichen Stream-Objekts durch ein aktualisiertes Objekt.The stream upgrade consists in replacing the original Stream object with an upgraded one.

Sie können z. B. einen Komprimierungsstream direkt über dem Transportstream erstellen.For example, you can build a compression stream directly on top of the transport stream. In diesem Fall wird der ursprüngliche Transport-Stream durch einen Stream ersetzt, der den ursprünglichen Stream mit dem Komprimierungs-Stream umschließt.In this case the original transport Stream is replaced with one that wraps the compression Stream around the original one.

Sie können mehrere Stream-Upgrades implementieren, die das jeweils vorangehende Upgrade umschließen.You can apply multiple stream upgrades, each wrapping the preceding one.

Funktionsweise von Stream-UpgradesHow Stream Upgrades Work

Der Stream-Upgrade-Prozess besteht aus vier Komponenten.There are four components to the stream upgrade process.

  1. Upgrade-Stream Initiator startet den Prozess: zur Laufzeit können sie eine Anforderung an das andere Ende der Verbindung zur der kanaltransportebene initiieren.An upgrade stream Initiator begins the process: at run-time it can initiate a request to the other end of its connection to upgrade the channel transport layer.

  2. Upgrade-Stream annehmenden führt das Upgrade: zur Laufzeit er empfängt die upgradeanforderung von dem anderen Computer und akzeptiert ggf. das Upgrade.An upgrade stream Acceptor carries out the upgrade: at run-time it receives the upgrade request from the other machine, and if possible, accepts the upgrade.

  3. Ein Upgrade Anbieter erstellt die Initiator auf dem Client und dem annehmenden auf dem Server.An upgrade Provider creates the Initiator on the client and the Acceptor on the server.

  4. Ein streamupgrade Bindungselements wird an die Bindungen auf den Dienst und dem Client hinzugefügt und erstellt zur Laufzeit den Anbieter.A stream upgrade Binding Element is added to the bindings on the service and the client, and creates the provider at runtime.

Bei mehreren Upgrades kapseln der Initiator und der Annehmende Zustandsautomaten, um zu erzwingen, welche Upgradeübergänge für jede Initiierung gültig sind.Note that in the case of multiple upgrades, the Initiator and Acceptor encapsulate state machines to enforce which upgrade transitions are valid for each Initiation.

So implementieren Sie ein StreamupgradeHow to Implement a Stream Upgrade

Windows Communication Foundation (WCF) bietet vier abstract Klassen, die Sie implementieren können:Windows Communication Foundation (WCF) provides four abstract classes that you can implement:

Gehen Sie wie folgt vor, um ein benutzerdefiniertes Streamupgrade zu implementieren.To implement a custom stream upgrade, do the following. Bei dieser Prozedur wird ein minimaler Streamupgradevorgang auf den Client- und Servercomputern implementiert.This procedure implements a minimal stream upgrade process on both the client and server machines.

  1. Erstellen Sie eine Klasse, die das StreamUpgradeInitiator implementiert.Create a class that implements StreamUpgradeInitiator.

    1. Überschreiben Sie die InitiateUpgrade-Methode, um den zu aktualisierenden Stream anzugeben, und geben Sie den aktualisierten Stream zurück.Override the InitiateUpgrade method to take in the stream to be upgraded, and return the upgraded stream. Diese Methode funktioniert synchron; es gibt analoge Methoden, um das Upgrade asynchron zu initiieren.This method works synchronously; there are analogous methods to initiate the upgrade asynchronously.

    2. Überschreiben Sie die GetNextUpgrade-Methode, um zusätzliche Upgrades zu suchen.Override the GetNextUpgrade method to check for additional upgrades.

  2. Erstellen Sie eine Klasse, die das StreamUpgradeAcceptor implementiert.Create a class that implements StreamUpgradeAcceptor.

    1. Überschreiben Sie die AcceptUpgrade-Methode, um den zu aktualisierenden Stream anzugeben, und geben Sie den aktualisierten Stream zurück.Override the AcceptUpgrade method to take in the stream to be upgraded, and return the upgraded stream. Diese Methode funktioniert synchron; es gibt analoge Methoden, um das Upgrade asynchron anzunehmen.This method works synchronously; there are analogous methods to accept the upgrade asynchronously.

    2. Überschreiben Sie die CanUpgrade-Methode, um festzulegen, ob das angeforderte Upgrade von dem Annehmenden des Upgrades an dieser Stelle im Upgradeprozess unterstützt wird.Override the CanUpgrade method to determine if the upgrade requested is supported by this upgrade acceptor at this point in the upgrade process.

  3. Erstellen Sie eine Klasse, die den StreamUpgradeProvider implementiert.Create a class the implements StreamUpgradeProvider. Überschreiben Sie die CreateUpgradeAcceptor-Methode und die CreateUpgradeInitiator-Methode, um Instanzen des in Schritt 1 und 2 definierten Annehmenden und Initiators zurückzugeben.Override the CreateUpgradeAcceptor and the CreateUpgradeInitiator methods to return instances of the acceptor and initiator defined in steps 2 and 1.

  4. Erstellen Sie eine Klasse, die das StreamUpgradeBindingElement implementiert.Create a class that implements StreamUpgradeBindingElement.

    1. Überschreiben Sie die BuildClientStreamUpgradeProvider-Methode auf dem Client und die BuildServerStreamUpgradeProvider-Methode auf dem Dienst.Override the BuildClientStreamUpgradeProvider method on the client and the BuildServerStreamUpgradeProvider method on the service.

    2. Überschreiben Sie die BuildChannelFactory-Methode auf dem Client und die BuildChannelListener-Methode auf dem Dienst, um das Upgrade-Bindungselement zu BindingParameters hinzuzufügen.Override the BuildChannelFactory method on the client and the BuildChannelListener method on the service to add the upgrade Binding Element to BindingParameters.

  5. Fügen Sie das neue Stream-Upgrade-Bindungselement Bindungen auf den Server- und Clientcomputern hinzu.Add the new stream upgrade binding element to bindings on the server and client machines.

SicherheitsupgradesSecurity Upgrades

Das Hinzufügen eines Sicherheitsupgrades ist eine spezielle Version des allgemeinen Stream-Upgrade-Prozesses.Adding a security upgrade is a specialized version of the general stream upgrade process.

WCF stellt bereits zwei Bindungselemente für das Upgrade von Stream Security.WCF already provides two binding elements for upgrading stream security. Die Konfiguration der Sicherheit auf Transportebene wird durch das WindowsStreamSecurityBindingElement und das SslStreamSecurityBindingElement gekapselt, die konfiguriert und einer benutzerdefinierten Bindung hinzugefügt werden können.The configuration of transport-level security is encapsulated by the WindowsStreamSecurityBindingElement and the SslStreamSecurityBindingElement which can be configured and added to a custom binding. Diese Bindungselemente erweitern die StreamUpgradeBindingElement-Klasse, die den Client- und Server-Stream-Upgrade-Anbieter erstellt.These binding elements extend the StreamUpgradeBindingElement class that builds the client and server stream upgrade providers. Diese Bindungselements enthalten Methoden zum Erstellen der speziellen Upgradeanbieterklassen für Sicherheitsstream, die nicht public sind, in diesen beiden Fällen müssen Sie lediglich das Bindungselement der Bindung hinzufügen.These binding elements have methods that create the specialized security stream upgrade provider classes, which are not public, so for these two cases all you need to do is to add the binding element to the binding.

Bei Sicherheitsszenarien, die die beiden oben angeführten Bindungselemente nicht erfüllen, werden drei sicherheitsrelevante abstract-Klassen von den oben genannten Basisklassen für Initiator, Annehmender und Anbieter abgeleitet:For security scenarios not met by the above two binding elements, three security-related abstract classes are derived from the above initiator, acceptor and provider base classes:

  1. System.ServiceModel.Channels.StreamSecurityUpgradeInitiator

  2. System.ServiceModel.Channels.StreamSecurityUpgradeAcceptor

  3. System.ServiceModel.Channels.StreamSecurityUpgradeProvider

Der Vorgang zum Implementieren eines Security Stream-Upgrades ist der gleiche wie zuvor, mit dem Unterschied, dass Sie von diesen drei Klassen ableiten.The process of implementing a security stream upgrade is the same as before, with the difference that you would derive from these three classes. Überschreiben Sie die zusätzlichen Eigenschaften in diesen Klassen, um Sicherheitsinformationen zur Laufzeit anzugeben.Override the additional properties in these classes to supply security information to the runtime.

Mehrere UpgradesMultiple Upgrades

Wiederholen Sie zum Erstellen zusätzlicher Upgradeanforderungen den oben aufgeführten Vorgang: Erstellen Sie zusätzliche Erweiterungen von StreamUpgradeProvider und Bindungselemente.To create additional upgrade requests repeat the above process: create additional extensions of StreamUpgradeProvider and binding elements. Fügen Sie die Bindungselemente der Bindung hinzu.Add the binding elements to the binding. Die zusätzlichen Bindungselemente werden nacheinander verarbeitet, beginnend mit dem ersten der Bindung hinzugefügten Bindungselement.The additional binding elements are processed sequentially, starting with the first binding element added to the binding. In BuildChannelFactory und BuildChannelListener kann jeder Upgradeanbieter die eigene Anordnung auf bereits vorhandene Upgradebindungsparameter festlegen.In BuildChannelFactory and BuildChannelListener each upgrade provider can determine how to layer itself on any pre-existing upgrade binding parameters. Anschließend muss der vorhandene Upgradebindungsparameter durch einen neuen zusammengesetzten Upgradebindungsparameter ersetzt werden.It should then replace the existing upgrade binding parameter with a new composite upgrade binding parameter.

Alternativ kann ein Upgradeanbieter mehrere Upgrades unterstützen.Alternatively, one upgrade provider can support multiple upgrades. Sie können z. B. einen benutzerdefinierten Stream-Upgrade-Anbieter implementieren, der Sicherheit und Komprimierung unterstützt.For example, you might want to implement a custom stream upgrade provider that supports both security and compression. Führen Sie die folgenden Schritte aus:Do the following steps:

  1. Bilden Sie eine Unterklasse für den StreamSecurityUpgradeProvider, um die Anbieterklasse zu schreiben, die den Initiator und Annehmenden erstellt.Subclass StreamSecurityUpgradeProvider to write the provider class that creates the Initiator and Acceptor.

  2. Bilden Sie eine Unterklasse für den StreamSecurityUpgradeInitiator, und überschreiben Sie die GetNextUpgrade-Methode, um die Inhaltstypen für den Komprimierungsstream und den sicheren Stream nacheinander zurückzugeben.Subclass the StreamSecurityUpgradeInitiator making sure to override the GetNextUpgrade method to return the content types for the compression stream and the secure stream in order.

  3. Bilden Sie eine Unterklasse für den StreamSecurityUpgradeAcceptor, der die benutzerdefinierten Inhaltstypen in seiner CanUpgrade-Methode lesen kann.Subclass the StreamSecurityUpgradeAcceptor that understands the custom content types in its CanUpgrade method.

  4. Der Stream wird nach jedem Aufruf an GetNextUpgrade und CanUpgrade aktualisiert.The stream will be upgraded after each call to GetNextUpgrade and CanUpgrade.

Siehe auchSee Also

StreamUpgradeInitiator
StreamSecurityUpgradeInitiator
StreamUpgradeAcceptor
StreamSecurityUpgradeAcceptor
StreamUpgradeProvider
StreamSecurityUpgradeProvider
StreamUpgradeBindingElement
SslStreamSecurityBindingElement
WindowsStreamSecurityBindingElement