Een BindingElement maken
Bindingen en bindingselementen (objecten die zich uitbreiden System.ServiceModel.Channels.Binding en System.ServiceModel.Channels.BindingElementrespectievelijk) bevinden zich op de plaats waar het WCF-toepassingsmodel (Windows Communication Foundation) is gekoppeld aan kanaalfactory's en kanaallisteners. Zonder bindingen vereist het gebruik van aangepaste kanalen programmeren op kanaalniveau, zoals beschreven in Programmeren op servicekanaalniveau en programmeren op clientkanaalniveau. In dit onderwerp wordt de minimale vereiste besproken voor het gebruik van uw kanaal in WCF, de ontwikkeling van een BindingElement voor uw kanaal en het inschakelen van gebruik vanuit de toepassing, zoals beschreven in stap 4 van Het ontwikkelen van kanalen.
Overzicht
Door een BindingElement voor uw kanaal te maken, kunnen ontwikkelaars dit gebruiken in een WCF-toepassing. BindingElement objecten kunnen vanuit de System.ServiceModel.ServiceHost klasse worden gebruikt om een WCF-toepassing te verbinden met uw kanaal zonder dat u de exacte typegegevens van uw kanaal hoeft te gebruiken.
Zodra er een is BindingElement gemaakt, kunt u meer functionaliteit inschakelen, afhankelijk van uw vereisten door de resterende stappen voor kanaalontwikkeling te volgen die worden beschreven in Het ontwikkelen van kanalen.
Een bindingselement toevoegen
Als u een aangepaste BindingElementklasse wilt implementeren, schrijft u een klasse die overschrijft van BindingElement. Als u bijvoorbeeld een ChunkingChannel
bericht hebt ontwikkeld dat grote berichten in segmenten kan opsplitsen en deze aan het andere uiteinde opnieuw kan samenvoegen, kunt u dit kanaal in elke binding gebruiken door een BindingElement binding te implementeren en de binding zo te configureren dat deze wordt gebruikt. In de rest van dit onderwerp wordt het ChunkingChannel
voorbeeld gebruikt om de vereisten voor het implementeren van een bindingselement te demonstreren.
A ChunkingBindingElement
is verantwoordelijk voor het maken van de ChunkingChannelFactory
en ChunkingChannelListener
. Het overschrijft CanBuildChannelFactory en CanBuildChannelListener implementeert en controleert of de typeparameter is IDuplexSessionChannel (in ons voorbeeld is dit de enige kanaalshape die wordt ondersteund door de ChunkingChannel
) en dat de andere bindingselementen in de binding deze kanaalshape ondersteunen.
BuildChannelFactory controleert eerst of de aangevraagde kanaalshape kan worden gemaakt en vervolgens wordt een lijst met berichtacties opgehaald die moeten worden gesegmenteerd. Vervolgens wordt er een nieuwe ChunkingChannelFactory
, doorgegeven aan de binnenste kanaalfactory. (Als u een transportbindingselement maakt, is dat element de laatste in de bindingsstack en moet daarom een kanaallistener of kanaalfactory maken.)
BuildChannelListener heeft een vergelijkbare implementatie voor het maken ChunkingChannelListener
en doorgeven van de interne kanaallistener.
Als een ander voorbeeld van een transportkanaal biedt het voorbeeld Transport: UDP de volgende onderdrukking.
In het voorbeeld is UdpTransportBindingElement
het bindingselement , dat is afgeleid van TransportBindingElement. De volgende methoden worden overschreven om de factory's te bouwen die aan het kanaal zijn gekoppeld.
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);
}
Het bevat ook leden voor het BindingElement
klonen en retourneren van ons schema (soap.udp).
Protocolbindingselementen
Nieuwe bindingselementen kunnen alle opgenomen bindingselementen vervangen of uitbreiden, nieuwe transporten, coderingen of protocollen op een hoger niveau toevoegen. Als u een nieuw protocolbindingselement wilt maken, begint u met het uitbreiden van de BindingElement klasse. U moet ten minste het BindingElement.Clone gebruik IChannel.GetPropertyimplementeren en implementerenChannelProtectionRequirements
. Hiermee wordt het ChannelProtectionRequirements voor dit bindingselement geretourneerd. Zie ChannelProtectionRequirements voor meer informatie.
Clone moet een nieuwe kopie van dit bindingselement retourneren. Als best practice raden we aan dat auteurs van bindingselementen implementeren Clone met behulp van een kopieerconstructor die de basiskopieconstructor aanroept en vervolgens eventuele extra velden in deze klasse kloont.
Transportbindingselementen
Als u een nieuw transportbindingselement wilt maken, breidt u de TransportBindingElement interface uit. U moet ten minste de Clone methode en de TransportBindingElement.Scheme eigenschap implementeren.
Clone – Moet een nieuwe kopie van dit bindingselement retourneren. Als best practice raden we aan dat auteurs van bindingselementen clone implementeren via een kopieerconstructor die de basiskopieconstructor aanroept en vervolgens eventuele extra velden in deze klasse kloont.
Scheme – De Scheme get-eigenschap retourneert het URI-schema voor het transportprotocol dat wordt vertegenwoordigd door het bindingselement. Bijvoorbeeld: de System.ServiceModel.Channels.HttpTransportBindingElement en de System.ServiceModel.Channels.TcpTransportBindingElement retourneert 'http' en 'net.tcp' uit hun respectieve Scheme eigenschappen.
Bindingselementen coderen
Als u nieuwe bindingselementen voor codering wilt maken, moet u eerst de BindingElement klasse uitbreiden en de System.ServiceModel.Channels.MessageEncodingBindingElement klasse implementeren. U moet ten minste de CloneMessageEncodingBindingElement.CreateMessageEncoderFactory methoden en de MessageEncodingBindingElement.MessageVersion eigenschap implementeren.
Clone. Retourneert een nieuwe kopie van dit bindingselement. Als best practice raden we aan dat auteurs van bindingselementen implementeren Clone met behulp van een kopieerconstructor die de basiskopieconstructor aanroept en vervolgens eventuele extra velden in deze klasse kloont.
CreateMessageEncoderFactory. Retourneert een MessageEncoderFactory, die een ingang biedt voor de werkelijke klasse die uw nieuwe encoder implementeert en die moet worden uitgebreid MessageEncoder. Zie voor meer informatie MessageEncoderFactory en MessageEncoder.
MessageVersion. Retourneert de MessageVersion gebruikte codering, die de versies van SOAP en WS-Addressing in gebruik vertegenwoordigt.
Zie voor een volledige lijst met optionele methoden en eigenschappen voor door de gebruiker gedefinieerde coderingsbindingselementen MessageEncodingBindingElement.
Zodra u een bindingselement voor uw kanaal hebt gemaakt, gaat u terug naar het onderwerp Kanalen ontwikkelen om te zien of u ondersteuning voor het configuratiebestand wilt toevoegen aan uw bindingselement, of en hoe u ondersteuning voor metagegevenspublicaties toevoegt en of en hoe u een door de gebruiker gedefinieerde binding maakt die gebruikmaakt van uw bindingselement.