Erstellen benutzerdefinierter BindungenCreating User-Defined Bindings

Es gibt mehrere Möglichkeiten, Bindungen zu erstellen, die nicht vom System bereitgestellt werden:There are several ways to create bindings not provided by the system:

  • Erstellen Sie eine benutzerdefinierte Bindung auf Grundlage der CustomBinding-Klasse, die einen Container darstellt, den Sie mit Bindungselementen füllen.Create a custom binding, based on the CustomBinding class, which is a container that you fill with binding elements. Die benutzerdefinierte Bindung wird dann einem Dienstendpunkt hinzugefügt.The custom binding is then added to a service endpoint. Sie können die benutzerdefinierte Bindung entweder programmgesteuert oder in der Konfigurationsdatei einer Anwendung erstellen.You can create the custom binding either programmatically or in an application configuration file. Um das Bindungselement aus einer Anwendungskonfigurationsdatei verwenden zu können, muss es BindingElementExtensionElement erweitern.To use a binding element from an application configuration file, the binding element must extend BindingElementExtensionElement. Weitere Informationen über benutzerdefinierte Bindungen finden Sie unter benutzerdefinierte Bindungen und CustomBinding.For more information about custom bindings, see Custom Bindings and CustomBinding.

  • Sie können eine Klasse erstellen, die von einer Standardbindung abgeleitet ist.You can create a class that derives from a standard binding. Sie können beispielsweise eine Klasse von WSHttpBinding ableiten und die CreateBindingElements-Methode überschreiben, um Bindungselemente abzurufen und ein benutzerdefiniertes Bindungselement einzufügen oder einen bestimmten Wert für die Sicherheit festzulegen.For example, you can derive a class from WSHttpBinding and override CreateBindingElements method to obtain the binding elements and insert a custom binding element or establish a particular value for security.

  • Sie können einen neuen Binding-Typ erstellen, um die Bindungsimplementierung vollständig zu steuern.You can create a new Binding type to completely control the entire binding implementation.

Die Reihenfolge der BindungselementeThe Order of Binding Elements

Jedes Bindungselement stellt einen Verarbeitungsschritt beim Senden und Empfangen von Nachrichten dar.Each binding element represents a processing step when sending or receiving messages. Zur Laufzeit erstellen Bindungselemente die Kanäle und die Listener, die notwendig sind, um ausgehende und eingehende Kanalstapel zu erstellen.At runtime, binding elements create the channels and listeners necessary to build outgoing and incoming channel stacks.

Es gibt drei Haupttypen von Bindungselementen: Protokollbindungselemente, Codierungsbindungselemente und Transportbindungselemente.There are three main types of binding elements: Protocol Binding Elements, Encoding Binding Elements and Transport Binding Elements.

Protokollbindungselemente – Diese Elemente stellen für Nachrichten ausgeführte Verarbeitungsschritte auf höherer Ebene dar.Protocol Binding Elements – These elements represent higher-level processing steps that act on messages. Die von diesen Bindungselementen erstellten Kanäle und Listener können den Nachrichteninhalt hinzufügen, entfernen oder ändern.Channels and listeners created by these binding elements can add, remove, or modify the message content. Eine gegebene Bindung verfügt möglicherweise über eine beliebige Anzahl von Protokollbindungselementen, die alle von BindingElement erben.A given binding may have an arbitrary number of protocol binding elements, each inheriting from BindingElement. Windows Communication Foundation (WCF) enthält mehrere protokollbindungselemente, einschließlich der ReliableSessionBindingElement und SymmetricSecurityBindingElement.Windows Communication Foundation (WCF) includes several protocol binding elements, including the ReliableSessionBindingElement and the SymmetricSecurityBindingElement.

Codierungsbindungselemente – Diese Elemente stellen eine Transformation zwischen einer Nachricht und einer Codierung dar, die für die Weiterleitung im Netz bereit ist.Encoding Binding Element – These elements represent transformations between a message and an encoding ready for transmission on the wire. Normale WCF-Bindungen umfassen genau ein Codierungsbindungselement.Typical WCF bindings include exactly one encoding binding element. Beispiele für Codierungsbindungselemente sind MtomMessageEncodingBindingElement, BinaryMessageEncodingBindingElement und TextMessageEncodingBindingElement.Examples of encoding binding elements include the MtomMessageEncodingBindingElement, the BinaryMessageEncodingBindingElement, and the TextMessageEncodingBindingElement. Wird für eine Bindung kein Codierungsbindungselement angegeben, wird eine Standardcodierung verwendet.If an encoding binding element is not specified for a binding, a default encoding is used. Wenn als Transport HTTP verwendet wird, ist dieser Standard Text, andernfalls binär.The default is text when the transport is HTTP and binary otherwise.

Transportbindungselemente – Diese Elemente stellen die Übertragung einer codierten Nachricht über ein Transportprotokoll dar.Transport Binding Element – These elements represent the transmission of an encoding message on a transport protocol. Normale WCF-Bindungen umfassen genau ein Transportbindungselement, das erbt TransportBindingElement.Typical WCF bindings include exactly one transport binding element, which inherits from TransportBindingElement. Beispiele für Transportbindungselemente sind TcpTransportBindingElement, HttpTransportBindingElement und NamedPipeTransportBindingElement.Examples of transport binding elements include the TcpTransportBindingElement, the HttpTransportBindingElement, and the NamedPipeTransportBindingElement.

Bei der Erstellung neuer Bindungen ist die Reihenfolge der hinzugefügten Bindungselemente wichtig.When creating new bindings, the order of the added binding elements is important. Fügen Sie Bindungselemente immer in der folgenden Reihenfolge hinzu:Always add binding elements in the following order:

EbeneLayer OptionenOptions ErforderlichRequired
TransaktionsflussTransaction Flow System.ServiceModel.Channels.TransactionFlowBindingElement NeinNo
ZuverlässigkeitReliability System.ServiceModel.Channels.ReliableSessionBindingElement NeinNo
SicherheitSecurity System.ServiceModel.Channels.SecurityBindingElement NeinNo
Composite DuplexComposite Duplex System.ServiceModel.Channels.CompositeDuplexBindingElement NeinNo
CodierungEncoding Text, Binärdatei, MTOM, benutzerdefiniertText, Binary, MTOM, Custom Ja*Yes*
TransportTransport TCP, Named Pipes, HTTP, HTTPS, MSMQ, benutzerdefiniertTCP, Named Pipes, HTTP, HTTPS, MSMQ, Custom JaYes

* Da eine Codierung für jede Bindung erforderlich ist, wenn keine Codierung festgelegt ist, fügt WCF eine standardcodierung für Sie.*Because an encoding is required for each binding, if an encoding is not specified, WCF adds a default encoding for you. Der Standard ist Text/XML für die HTTP- und HTTPS-Transporte, andernfalls binär.The default is Text/XML for the HTTP and HTTPS transports, and Binary otherwise.

Erstellen eines neuen BindungselementsCreating a new Binding Element

Zusätzlich zu den von abgeleiteten Typen BindingElement , sind bereitgestellten von WCF, Sie Ihre eigenen Bindungselemente erstellen können.In addition to the types derived from BindingElement that are provided by WCF, you can create your own binding elements. 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.This lets you customize the way the stack of bindings is created and the components that go in it by creating your own BindingElement that can be composed with the other system-provided types in the stack.

Wenn Sie beispielsweise ein LoggingBindingElement implementieren, das Nachrichten in einer Datenbank protokollieren kann, müssen Sie es im Kanalstapel oberhalb eines Transportkanals platzieren.For example, if you implement a LoggingBindingElement that provides the ability to log the message to a database, you must place it above a transport channel in the channel stack. In diesem Fall erstellt die Anwendung eine benutzerdefinierte Bindung, die, wie im folgenden Beispiel, das LoggingBindingElement mit dem TcpTransportBindingElement kombiniert.In this case, the application creates a custom binding that composed the LoggingBindingElement with TcpTransportBindingElement, as in the following example.

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

Wie Sie Ihr neues Bindungselement schreiben, hängt von seiner genauen Funktionalität ab.How you write your new binding element depends on its exact functionality. Eines der Beispiele, Transport: UDP, enthält eine ausführliche Beschreibung dazu, wie eine Art von Bindungselement implementieren.One of the samples, Transport: UDP, provides a detailed description of how to implement one kind of binding element.

Erstellen einer neuen BindungCreating a New Binding

Ein benutzerdefiniertes Bindungselement kann auf zwei Weisen verwendet werden.A user-created binding element can be used in two ways. Im vorherigen Abschnitt wurde die erste beschrieben: durch eine benutzerdefinierte Bindung.The previous section illustrates the first way: through a custom binding. Benutzerdefinierte Bindungen erlauben Benutzern, basierend auf einer beliebigen Gruppe von Bindungselementen einschließlich solcher, die von Benutzern erstellt wurden, eigene Bindungen zu definieren.A custom binding allows the user to create their own binding based on an arbitrary set of binding elements, including user-created ones.

Wenn Sie die Bindung in mehr als einer Anwendung einsetzen, dann erstellen Sie die eigene Bindung und erweitern die Binding.If you use the binding in more than one application, create your own binding and extend the Binding. Dadurch ist es nicht mehr notwendig, jedes Mal, wenn Sie sie verwenden möchten, manuell eine benutzerdefinierte Bindung zu erstellen.This avoids manually creating a custom binding every time you want to use it. Eine benutzerdefinierte Bindung ermöglicht es Ihnen, das Verhalten der Bindung einschließlich benutzerdefinierter Bindungselemente zu definieren.A user-defined binding allows you to define the binding’s behavior and include user-defined binding elements. Und es ist vorab verpackt: Sie müssen nicht die Bindung neu erstellen, jedes Mal, wenn Sie ihn verwenden.And it is pre-packaged: you do not have to rebuild the binding every time you use it.

Eine benutzerdefinierte Bindung muss zumindest die CreateBindingElements-Methode und die Scheme-Eigenschaft implementieren.At a minimum, a user-defined binding must implement the CreateBindingElements method and the Scheme property.

Die CreateBindingElements-Methode gibt eine neue BindingElementCollection zurück, die die Bindungselemente für die Bindung enthält.The CreateBindingElements method returns a new BindingElementCollection that contains the binding elements for the binding. Die Auflistung ist sortiert, wobei die Protokollbindungselemente an erster Stelle stehen sollten, gefolgt von dem Codierungsbindungselement und dem Transportbindungselement.The collection is ordered, and should contain the protocol binding elements first, followed by the encoding binding element, followed by the transport binding element. Wenn Sie die WCF-Bindung für vom System bereitgestellte Elemente verwenden zu können, muss das Bindungselement, das Regeln, die im angegebenen Sortierung folgen benutzerdefinierte Bindungen.When using the WCF system-provided binding elements, you must follow the binding element ordering rules specified in Custom Bindings. 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.This collection should never reference objects referenced within the user-defined binding class; consequently, binding authors must return a Clone() of the BindingElementCollection on each call to CreateBindingElements.

Die Scheme-Eigenschaft stellt das URI-Schema für das in der Bindung verwendete Transportprotokoll dar.The Scheme property represents the URI scheme for the transport protocol in use on the binding. Z. B. die WSHttpBinding und NetTcpBinding Zurückgeben von "http" und "net.tcp" von ihren jeweiligen Scheme Eigenschaften.For example, the WSHttpBinding and the NetTcpBinding return "http" and "net.tcp" from their respective Scheme properties.

Eine vollständige Liste optionaler Methoden und Eigenschaften für benutzerdefinierte Bindungselemente finden Sie unter Binding.For a complete list of optional methods and properties for user-defined bindings, see Binding.

BeispielExample

In diesem Beispiel wird Profilbindung in SampleProfileUdpBinding implementiert, das von Binding abgeleitet wird.This example implements profile binding in SampleProfileUdpBinding, which derives from Binding. Die SampleProfileUdpBinding enthält bis zu vier Bindungselemente: ein benutzerdefiniertes UdpTransportBindingElement; und drei vom System bereitgestellte: TextMessageEncodingBindingElement, CompositeDuplexBindingElement, und ReliableSessionBindingElement.The SampleProfileUdpBinding contains up to four binding elements within it: one user-created UdpTransportBindingElement; and three system-provided: TextMessageEncodingBindingElement, CompositeDuplexBindingElement, and 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ägenSecurity Restrictions with Duplex Contracts

Nicht alle Bindungselemente sind miteinander kompatibel.Not all binding elements are compatible with each other. Es gibt insbesondere einige Einschränkungen für Sicherheitsbindungselemente, wenn sie mit Duplexverträgen verwendet werden.In particular, there are some restrictions on security binding elements when used with duplex contracts.

One-Shot-SicherheitOne-Shot Security

Implementiertem "One-Shot"-Sicherheit, in dem alle notwendigen Sicherheitsanmeldeinformationen durch Festlegen von in einer einzelnen Nachricht gesendet werden die negotiateServiceCredential Attribut des der <Nachricht >-Konfigurationselements auf false.You can implement "one-shot" security, where all the necessary security credentials are sent in a single message, by setting the negotiateServiceCredential attribute of the <message> configuration element to false.

Die "One-Shot"-Authentifizierung funktioniert nicht mit Duplexverträgen.One-shot authentication does not work with duplex contracts.

Bei Anforderung-Antwort-Verträgen funktioniert die "One-Shot"-Authentifizierung nur, wenn der Bindungsstapel unter dem Sicherheitsbindungselement die Erstellung von IRequestChannel- oder IRequestSessionChannel-Instanzen unterstützt.For Request-Reply contracts, one-shot authentication works only if the binding stack below the security binding element supports creating IRequestChannel or IRequestSessionChannel instances.

Bei unidirektionalen Verträgen funktioniert die "One-Shot"-Authentifizierung, wenn der Bindungsstapel unter dem Sicherheitsbindungselement die Erstellung von IRequestChannel-, IRequestSessionChannel-, IOutputChannel- oder IOutputSessionChannel-Instanzen unterstützt.For one-way contracts, one-shot authentication works if the binding stack below the security binding element supports creating IRequestChannel, IRequestSessionChannel, IOutputChannel or IOutputSessionChannel instances.

Cookie-Modus-Sicherheitskontexttoken können nicht mit Duplexverträgen verwendet werden.Cookie mode security context tokens cannot be used with duplex contracts.

Bei Anforderung-Antwort-Verträgen funktionieren Cookie-Modus-Sicherheitskontexttoken nur, wenn der Bindungsstapel unter dem Sicherheitsbindungselement die Erstellung von IRequestChannel- oder IRequestSessionChannel-Instanzen unterstützt.For Request-Reply contracts, cookie-mode security context tokens work only if the binding stack below the security binding element supports creating IRequestChannel or IRequestSessionChannel instances.

Bei unidirektionalen Verträgen funktionieren Cookie-Modus-Sicherheitskontexttoken, wenn der Bindungsstapel unter dem Sicherheitsbindungselement die Erstellung von IRequestChannel- oder IRequestSessionChannel-Instanzen unterstützt.For one-way contracts, cookie-mode security context tokens works if the binding stack below the security binding element supports creating IRequestChannel or IRequestSessionChannel instances.

Sitzungsmodus-SicherheitskontexttokenSession-mode Security Context Tokens

Ein Sitzungsmodus-SCT funktioniert für Duplexverträge, wenn der Bindungsstapel unter dem Sicherheitsbindungselement die Erstellung von IDuplexChannel- oder IDuplexSessionChannel-Instanzen unterstützt.Session mode SCT works for duplex contracts if the binding stack below the security binding element supports creating IDuplexChannel or IDuplexSessionChannel instances.

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.Session mode SCT works for Request-Reply contracts if the binding stack below the security binding element supports creating IDuplexChannel, IDuplexSessionChannel, IRequestChannel or IRequestSessionChannel, instances.

Ein Sitzungsmodus-SCT funktioniert für unidirektionale Verträge, wenn der Bindungsstapel unter dem Sicherheitsbindungselement die Erstellung von IDuplexChannel-, IDuplexSessionChannel-, IRequestChannel- oder IRequestSessionChannel-Instanzen unterstützt.Session mode SCT works for 1-way contracts if the binding stack below the security binding element supports creating IDuplexChannel, IDuplexSessionChannel, IRequestChannel or IRequestSessionChannel instances.

Ableiten von einer StandardbindungDeriving from a Standard Binding

Statt eine völlig neue Bindungsklasse zu erstellen, ist es möglich, eine vorhandene, vom System bereitgestellte Bindung zu erweitern.Instead of creating an entirely new binding class, it may be possible for you to extend one of the existing system-provided bindings. Ähnlich wie im vorangegangenen Fall müssen Sie die CreateBindingElements-Methode und die Scheme-Eigenschaft überschreiben.Much like the preceding case, you must override the CreateBindingElements method and the Scheme property.

Siehe auchSee Also

Binding
Benutzerdefinierte BindungenCustom Bindings