Freigeben über


Erstellen eines BindingElement

Bindungen und Bindungselemente (Objekte, die System.ServiceModel.Channels.Binding bzw. System.ServiceModel.Channels.BindingElement erweitern) sind die Orte, an denen das WCF-Anwendungsmodell (Windows Communication Foundation) Kanalfactorys und Kanallistenern zugeordnet wird. Ohne Bindungen müssen benutzerdefinierte Kanäle auf Kanalebene programmiert werden, wie beschrieben in Dienstprogrammierung auf Kanalebene und Clientprogrammierung auf Kanalebene. In diesem Thema geht es um die Mindestanforderungen für die Verwendung Ihres Kanals in WCF, die Entwicklung eines BindingElement für Ihren Kanal sowie die Aktivierung der Verwendung aus der Anwendung, wie in Schritt 4 unter Entwickeln von Kanälen beschrieben.

Übersicht

Wenn Sie ein BindingElement für Ihren Kanal erstellen, können Entwickler*innen diesen in einer WCF-Anwendung verwenden. Mithilfe von BindingElement-Objekte können Sie eine WCF-Anwendung über die System.ServiceModel.ServiceHost-Klasse mit Ihrem Kanal verbinden, ohne über die genauen Typinformationen Ihres Kanals verfügen zu müssen.

Sobald ein BindingElement erstellt wurde, können Sie je nach Bedarf weitere Funktionalität aktivieren, indem Sie die übrigen Schritte zur Kanalentwicklung befolgen, die in Entwickeln von Kanälen beschrieben sind.

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 implementieren und die ChannelProtectionRequirements mithilfe 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 Bindungselementen 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. Beispielsweise geben System.ServiceModel.Channels.HttpTransportBindingElement und System.ServiceModel.Channels.TcpTransportBindingElement „http“ und „net.tcp“ über ihre 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 von benutzerdefinierten Bindungen.

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

Siehe auch