Erstellen eines BindingElement

Bindungen und Bindungselemente (Objekte, die System.ServiceModel.Channels.Binding bzw. System.ServiceModel.Channels.BindingElement erweitern) sind die Orte, an denen das Windows Communication Foundation (WCF)-Anwendungsmodell mit Kanalfactorys und Kanallistenern verknüpft wird.Ohne Bindungen erfordern benutzerdefinierte Kanäle das Programmieren auf Kanalebene, wie in Dienst-Kanalebenenprogrammierung und Client-Kanalebenenprogrammierung beschrieben.In diesem Thema werden die Mindestanforderungen für die Aktivierung Ihres Kanals in WCF, für die Entwicklung eines BindingElement für Ihren Kanal und für die Aktivierung von der Anwendung aus erläutert, wie in Schritt 4 unter Entwickeln von Kanälen beschrieben.

Übersicht

Durch Erstellen von BindingElement für Ihren Kanal können Entwickler ihn in einer WCF-Anwendung nutzen.BindingElement-Objekte können aus der System.ServiceModel.ServiceHost-Klasse verwendet werden, um eine WCF-Anwendung mit Ihrem Kanal zu verbinden, ohne dem genauen Informationstyp Ihres Kanals entsprechen zu müssen..

Sobald ein BindingElement erstellt wurde, können Sie je nach Anforderungen weitere Funktionen aktivieren, indem Sie die unter Entwickeln von Kanälen beschriebenen verbleibenden Kanalentwicklungsschritte ausführen.

Hinzufügen eines Bindungselements

Um ein benutzerdefiniertes BindingElement zu implementieren, schreiben Sie eine Klasse, die von BindingElement erbt.Wenn Sie beispielsweise einen ChunkingChannel entwickelt haben, der große Nachrichten segmentieren und sie am anderen Ende wieder zusammensetzen kann, können Sie diesen Kanal in jeder Bindung verwenden, indem Sie ein BindingElement implementieren und die Bindung für die entsprechende Verwendung konfigurieren.In diesem Thema wird der ChunkingChannel als Beispiel zur Demonstration der Implementierungsanforderungen eines Bindungselements verwendet.

Ein ChunkingBindingElement ist für das Erstellen der ChunkingChannelFactory und des ChunkingChannelListener verantwortlich.Es überschreibt die CanBuildChannelFactory-Implementierung und die CanBuildChannelListener-Implementierung und überprüft, ob der Typparameter IDuplexSessionChannel lautet (in unserem Beispiel ist dies die einzige Kanalform, die von ChunkingChannel unterstützt wird) und ob die anderen Bindungselemente der Bindung diese Kanalform unterstützen.

BuildChannelFactory überprüft zunächst, ob die angeforderte Kanalform erstellt werden kann, und ruft anschließend eine Liste der zu segmentierenden Nachrichtenaktionen auf.Es erstellt dann eine neue ChunkingChannelFactory und übergibt diese an die innere Kanalfactory.(Wenn Sie ein Transportbindungselement erstellen, ist dieses Element das letzte im Bindungsstapel und muss daher einen Kanallistener oder eine Kanalfactory erstellen.)

BuildChannelListener hat zum Erstellen von ChunkingChannelListener und zur Übergabe an den inneren Kanallistener eine ähnliche Implementierung.

Im Beispiel Transport: UDP wird die folgende Überschreibung als weitere Möglichkeit für einen Transportkanal bereitgestellt.

Im Beispiel ist das Bindungselement UdpTransportBindingElement, das von TransportBindingElement abgeleitet wird.Es überschreibt die folgenden Methoden zum Erstellen der dem Kanal zugeordneten Factorys.

public IChannelFactory<TChannel> BuildChannelFactory<TChannel>(BindingContext context)  
{  
            return (IChannelFactory<TChannel>)(object)new UdpChannelFactory(this, context);  
}  

public IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingContext context)  
{  
            return (IChannelListener<TChannel>)(object)new UdpChannelListener(this, context);  
}  

Es enthält auch Member zum Klonen des BindingElement und Zurückgeben unseres Schemas (soap.udp).

Protokollbindungselemente

Neue Bindungselemente können einbezogene Bindungselemente ersetzen oder erweitern sowie neue Transporte, Codierungen oder Protokolle auf höherer Ebene hinzufügen.Um ein neues Protokollbindungselement zu erstellen, erweitern Sie zunächst die BindingElement-Klasse.Anschließend müssen Sie mindestens das BindingElement.Clone und die ChannelProtectionRequirements unter Verwendung von IChannel.GetProperty implementieren.Dadurch werden die ChannelProtectionRequirements für dieses Bindungselement zurückgegeben.Weitere Informationen finden Sie unter ChannelProtectionRequirements.

Clone sollte eine neue Kopie dieses Bindungselements zurückgeben.Es wird empfohlen, dass Autoren von Bindungselementen Clone implementieren, indem sie einen Kopierkonstruktor verwenden, der den Basisklassen-Kopierkonstruktor aufruft, und anschließend zusätzliche Felder in dieser Klasse klonen.

Transportbindungselemente

Um ein neues Transportbindungselement zu erstellen, erweitern Sie die TransportBindingElement-Schnittstelle.Anschließend müssen Sie mindestens die Clone-Methode und die TransportBindingElement.Scheme-Eigenschaft implementieren.

Clone – Sollte eine neue Kopie dieses Bindungselements zurückgeben.Es wird empfohlen, dass Autoren von Bindungsemelenten einen Klon implementieren, indem sie einen Kopierkonstruktor verwenden, der den Basisklassen-Kopierkonstruktor aufruft, und anschließend zusätzliche Felder in dieser Klasse klonen.

Scheme – Die Scheme get-Eigenschaft gibt das URI-Schema für das Transportprotokoll zurück, das vom Bindungselement dargestellt wird.Das System.ServiceModel.Channels.HttpTransportBindingElement und das System.ServiceModel.Channels.TcpTransportBindingElement geben z. B. "http" und "net.tcp" von ihren jeweiligen Scheme-Eigenschaften zurück.

Codierungsbindungselemente

Um neue Codierungsbindungselemente zu erstellen, erweitern Sie zunächst die BindingElement-Klasse und implementieren die System.ServiceModel.Channels.MessageEncodingBindingElement-Klasse.Anschließend müssen Sie mindestens die Clone-Methode, die MessageEncodingBindingElement.CreateMessageEncoderFactory-Methode und die MessageEncodingBindingElement.MessageVersion-Eigenschaft implementieren.

  • Clone.Gibt eine neue Kopie dieses Bindungselements zurück.Es wird empfohlen, dass Autoren von Bindungselementen Clone implementieren, indem sie einen Kopierkonstruktor verwenden, der den Basisklassen-Kopierkonstruktor aufruft, und anschließend zusätzliche Felder in dieser Klasse klonen.

  • CreateMessageEncoderFactory.Gibt MessageEncoderFactory zurück, die ein Handle für eine tatsächliche Klasse bereitstellt, die den neuen Encoder implementiert und MessageEncoder erweitern sollte.Weitere Informationen finden Sie unter MessageEncoderFactory und MessageEncoder.

  • MessageVersion.Gibt die in dieser Codierung verwendete MessageVersion zurück, die die verwendeten Versionen von SOAP und WS-Adressierung darstellt.

Eine vollständige Liste optionaler Methoden und Eigenschaften zu benutzerdefinierten Codierungsbindungselementen finden Sie unter MessageEncodingBindingElement.

Weitere Informationen zum Erstellen eines neuen Bindungselements finden Sie unter Erstellen benutzerdefinierter Bindungen.

Nachdem Sie ein Bindungselement für Ihren Kanal erstellt haben, kehren Sie zum Thema Entwickeln von Kanälen zurück. Hier können Sie entscheiden, ob Sie Unterstützung für die Konfigurationsdatei zu Ihrem Bindungselement hinzufügen möchten, ob und wie Sie Unterstützung für die Metadatenveröffentlichung hinzufügen möchten und ob und wie Sie eine benutzerdefinierte Bindung erstellen, die Ihr Bindungselement verwendet.

Siehe auch

BindingElement
Entwickeln von Kanälen
Transport: UDP