Freigeben über


Erstellen benutzerdefinierter Bindungen

Es gibt mehrere Möglichkeiten zum Erstellen von Bindungen, die nicht vom System bereitgestellt werden:

  • Erstellen Sie eine benutzerdefinierte Bindung basierend auf der CustomBinding-Klasse, die einen Container darstellt, den Sie mit Bindungselementen ausfüllen. Die benutzerdefinierte Bindung wird dann einem Dienstendpunkt hinzugefügt. Sie können die benutzerdefinierte Bindung entweder programmgesteuert oder in einer Anwendungskonfigurationsdatei erstellen. Um ein Bindungselement aus einer Anwendungskonfigurationsdatei zu verwenden, muss das Bindungselement BindingElementExtensionElement erweitern. Weitere Informationen zu benutzerdefinierten Bindungen finden Sie unter Benutzerdefinierte Bindungen und CustomBinding.

  • Sie können eine Klasse erstellen, die von einer Standardbindung abgeleitet wird. Sie können z. B. eine Klasse von WSHttpBinding ableiten und die Methode CreateBindingElements überschreiben, um die Bindungselemente abzurufen und ein benutzerdefiniertes Bindungselement einzufügen oder einen bestimmten Wert für die Sicherheit einzurichten.

  • Sie können einen neuen Binding Typ erstellen, um die gesamte Bindungsimplementierung vollständig zu steuern.

Die Reihenfolge der Bindungselemente

Jedes Bindungselement stellt einen Verarbeitungsschritt beim Senden oder Empfangen von Nachrichten dar. Zur Laufzeit erstellen Bindungselemente die Kanäle und die Listener, die notwendig sind, um ausgehende und eingehende Kanalstapel zu erstellen.

Es gibt drei Haupttypen von Bindungselementen: Protokollbindungselemente, Codierungsbindungselemente und Transportbindungselemente.

Protokollbindungselemente – Diese Elemente stellen Verarbeitungsschritte auf höherer Ebene dar, die auf Nachrichten reagieren. Kanäle und Listener, die von diesen Bindungselementen erstellt wurden, können den Nachrichteninhalt hinzufügen, entfernen oder ändern. Eine bestimmte Bindung kann eine beliebige Anzahl von Protokollbindungselementen aufweisen, wobei jedes von BindingElement erbt. Windows Communication Foundation (WCF) enthält mehrere Protokollbindungselemente, einschließlich der ReliableSessionBindingElement und der SymmetricSecurityBindingElement.

Codierungsbindungselemente – Diese Elemente stellen eine Transformation zwischen einer Nachricht und einer Codierung dar, die für die Weiterleitung im Netz bereit ist. Typische WCF-Bindungen enthalten genau ein Codierungsbindungselement. Beispiele für Codierungsbindungselemente sind die MtomMessageEncodingBindingElement, die BinaryMessageEncodingBindingElement und die TextMessageEncodingBindingElement. Wenn kein Codierungsbindungselement für eine Bindung angegeben ist, wird eine Standardcodierung verwendet. Der Standardwert ist Text, wenn der Transport HTTP und andernfalls binär ist.

Transport Binding Element – Diese Elemente stellen die Übertragung einer Codierungsnachricht in einem Transportprotokoll dar. Typische WCF-Verbindungen enthalten genau ein Transportelement der Bindung, das von TransportBindingElement erbt. Beispiele für Transportbindungselemente sind das TcpTransportBindingElement, das HttpTransportBindingElement und das NamedPipeTransportBindingElement.

Beim Erstellen neuer Bindungen ist die Reihenfolge der hinzugefügten Bindungselemente wichtig. Fügen Sie bindungselemente immer in der folgenden Reihenfolge hinzu:

Ebene Optionen Erforderlich
Transaktionsfluss System.ServiceModel.Channels.TransactionFlowBindingElement Nein
Zuverlässigkeit System.ServiceModel.Channels.ReliableSessionBindingElement Nein
Sicherheit System.ServiceModel.Channels.SecurityBindingElement Nein
Verbundduplex System.ServiceModel.Channels.CompositeDuplexBindingElement Nein
Codierung Text, Binärdatei, MTOM, benutzerdefiniert Ja*
Transport TCP, Named Pipes, HTTP, HTTPS, MSMQ, Benutzerdefiniert Ja

*Da für jede Bindung eine Codierung erforderlich ist, wenn keine Codierung angegeben wird, fügt WCF eine Standardcodierung für Sie hinzu. Der Standardwert ist "Text/XML" für die HTTP- und HTTPS-Transporte und andernfalls "Binary".

Erstellen eines neuen Binding-Elements

Zusätzlich zu den von WCF bereitgestellten Typen aus BindingElement können Sie eigene Bindungselemente erstellen. Dadurch können Sie bestimmen, wie der Bindungsstapel und die Komponenten erstellt werden, die in die Erstellung Ihres eigenen BindingElement eingehen, das sich mit den anderen vom System bereitgestellten Typen auf dem Stapel kombinieren lässt.

Wenn Sie beispielsweise eine LoggingBindingElement Implementierung implementieren, die die Möglichkeit bietet, die Nachricht in einer Datenbank zu protokollieren, müssen Sie sie über einem Transportkanal im Kanalstapel platzieren. In diesem Fall erstellt die Anwendung eine benutzerdefinierte Bindung, die LoggingBindingElement mit TcpTransportBindingElement zusammensetzt, wie im folgenden Beispiel.

Binding customBinding = new CustomBinding(  
  new LoggingBindingElement(),
  new TcpTransportBindingElement()  
);  

Wie Sie Ihr neues Bindungselement schreiben, hängt von der genauen Funktionalität ab. Eines der Beispiele, Transport: UDP, enthält eine detaillierte Beschreibung der Implementierung einer Art von Bindungselement.

Erstellen einer neuen Bindung

Ein vom Benutzer erstelltes Bindungselement kann auf zwei Arten verwendet werden. Im vorherigen Abschnitt wird die erste Methode veranschaulicht: durch eine benutzerdefinierte Bindung. Eine benutzerdefinierte Bindung ermöglicht es dem Benutzer, eine eigene Bindung basierend auf einer beliebigen Gruppe von Bindungselementen zu erstellen, einschließlich von Benutzern erstellter Elemente.

Wenn Sie die Bindung in mehreren Anwendungen verwenden, erstellen Sie Ihre eigene Bindung und erweitern Sie Binding. Dadurch wird vermieden, dass jedes Mal, wenn Sie sie verwenden möchten, eine benutzerdefinierte Bindung manuell erstellt werden muss. Mit einer benutzerdefinierten Bindung können Sie das Verhalten der Bindung definieren und benutzerdefinierte Bindungselemente einschließen. Und es ist vorgepackt: Sie müssen die Bindung nicht jedes Mal neu erstellen, wenn Sie sie verwenden.

Mindestens muss eine benutzerdefinierte Bindung die CreateBindingElements Methode und die Scheme Eigenschaft implementieren.

Die CreateBindingElements Methode gibt eine neue BindingElementCollection zurück, die die Bindungselemente der Bindung enthält. Die Auflistung wird sortiert und sollte zuerst die Protokollbindungselemente enthalten, gefolgt vom Codierungsbindungselement, gefolgt vom Transportbindungselement. Wenn Sie die vom WCF-System bereitgestellten Bindungselemente verwenden, müssen Sie die in benutzerdefinierten Bindungen angegebenen Regeln für die Anordnung von Bindungselementen befolgen. Diese Auflistung sollte niemals auf Objekte verweisen, auf die innerhalb der benutzerdefinierten Bindungsklasse verwiesen wird. Daraus folgt, dass Autoren von Bindungen einen Clone() der BindingElementCollection bei jedem Aufruf von CreateBindingElements zurückgeben müssen.

Die Scheme Eigenschaft stellt das URI-Schema für das transportprotokoll dar, das für die Bindung verwendet wird. Beispielsweise geben WSHttpBinding und NetTcpBinding "http" und "net.tcp" aus ihren jeweiligen Scheme Eigenschaften zurück.

Eine vollständige Liste der optionalen Methoden und Eigenschaften für benutzerdefinierte Bindungen finden Sie unter Binding.

Beispiel

In diesem Beispiel wird die Profilbindung in SampleProfileUdpBinding implementiert, die sich von Binding ableitet. Das SampleProfileUdpBinding Enthält bis zu vier Bindungselemente darin: ein vom Benutzer erstelltes UdpTransportBindingElementElement und drei vom System bereitgestellte Elemente: TextMessageEncodingBindingElement, , CompositeDuplexBindingElementund ReliableSessionBindingElement.

public override BindingElementCollection CreateBindingElements()  
{
    BindingElementCollection bindingElements = new BindingElementCollection();  
    if (ReliableSessionEnabled)  
    {  
        bindingElements.Add(session);  
        bindingElements.Add(compositeDuplex);  
    }  
    bindingElements.Add(encoding);  
    bindingElements.Add(transport);  
    return bindingElements.Clone();  
}  

Sicherheitseinschränkungen bei Duplexverträgen

Nicht alle Bindungselemente sind miteinander kompatibel. Insbesondere gibt es einige Einschränkungen für Sicherheitsbindungselemente bei Verwendung mit Duplexverträgen.

One-Shot Sicherheit

Sie können die Sicherheit von "one-shot" implementieren, bei der alle erforderlichen Sicherheitsanmeldeinformationen in einer einzelnen Nachricht gesendet werden, indem Sie das negotiateServiceCredential Attribut des <Nachrichtenkonfigurationselements> auf falsefestlegen.

Die Einmalige Authentifizierung funktioniert nicht mit Duplexverträgen.

Bei Request-Reply Verträgen funktioniert die einmalige Authentifizierung nur, wenn der Bindungsstapel unter dem Sicherheitsbindungselement das Erstellen IRequestChannel oder IRequestSessionChannel Instanzen unterstützt.

Bei unidirektionalen Verträgen funktioniert die Einmalauthentifizierung, wenn der Bindungsstapel unterhalb des Sicherheitsbindungselements das Erstellen von IRequestChannel, IRequestSessionChannel, IOutputChannel oder IOutputSessionChannel-Instanzen unterstützt.

Sicherheitskontexttoken im Cookiemodus können nicht mit Duplexverträgen verwendet werden.

Bei Request-Reply Verträgen funktionieren Sicherheitskontexttoken im Cookiemodus nur, wenn der Bindungsstapel unter dem Sicherheitsbindungselement das Erstellen von Instanzen von IRequestChannel oder IRequestSessionChannel unterstützt.

Bei unidirektionalen Verträgen funktionieren Cookie-Modus-Sicherheitskontexttoken, wenn der Bindungsstapel unter dem Sicherheitsbindungselement die Erstellung von IRequestChannel- oder IRequestSessionChannel-Instanzen unterstützt.

Sicherheitskontexttoken im Sitzungsmodus

Der Sitzungsmodus SCT funktioniert für Duplexverträge, wenn der Bindungsstapel unterhalb des Sicherheitsbindungselements das Erstellen IDuplexChannel oder IDuplexSessionChannel Instanzen unterstützt.

Ein Sitzungsmodus-SCT funktioniert für Anforderung-Antwort-Verträge, wenn der Bindungsstapel unter dem Sicherheitsbindungselement die Erstellung von IDuplexChannel-, IDuplexSessionChannel-, IRequestChannel- oder IRequestSessionChannel-Instanzen unterstützt.

Der Sitzungsmodus SCT funktioniert für Einwegverträge, wenn der Bindungsstapel unterhalb des Sicherheitsbindungselements das Erstellen von IDuplexChannel, IDuplexSessionChannel, IRequestChannel oder IRequestSessionChannel Instanzen unterstützt.

Ableiten von einer Standardbindung

Anstatt eine völlig neue Bindungsklasse zu erstellen, kann es für Sie möglich sein, eine der vorhandenen vom System bereitgestellten Bindungen zu erweitern. Ähnlich wie im vorherigen Fall müssen Sie die CreateBindingElements Methode und die Scheme Eigenschaft überschreiben.

Siehe auch