Door de gebruiker gedefinieerde bindingen maken
Er zijn verschillende manieren om bindingen te maken die niet door het systeem worden geleverd:
Maak een aangepaste binding op basis van de CustomBinding klasse, een container die u vult met bindingselementen. De aangepaste binding wordt vervolgens toegevoegd aan een service-eindpunt. U kunt de aangepaste binding programmatisch of in een toepassingsconfiguratiebestand maken. Als u een bindingselement uit een toepassingsconfiguratiebestand wilt gebruiken, moet het bindingselement worden uitgebreid BindingElementExtensionElement. Zie Aangepaste bindingen en CustomBindingvoor meer informatie over aangepaste bindingen.
U kunt een klasse maken die is afgeleid van een standaardbinding. U kunt bijvoorbeeld een klasse afleiden van WSHttpBinding en overschrijven CreateBindingElements om de bindingselementen te verkrijgen en een aangepast bindingselement in te voegen of een bepaalde waarde voor beveiliging tot stand te brengen.
U kunt een nieuw Binding type maken om de volledige bindings implementatie volledig te beheren.
De volgorde van bindingselementen
Elk bindingselement vertegenwoordigt een verwerkingsstap bij het verzenden of ontvangen van berichten. Tijdens runtime maken bindingselementen de kanalen en listeners die nodig zijn om uitgaande en binnenkomende kanaalstacks te bouwen.
Er zijn drie hoofdtypen bindingselementen: protocolbindingselementen, bindingselementen en transportbindingselementen.
Protocolbindingselementen: deze elementen vertegenwoordigen verwerkingsstappen op een hoger niveau die op berichten reageren. Kanalen en listeners die door deze bindingselementen zijn gemaakt, kunnen de inhoud van het bericht toevoegen, verwijderen of wijzigen. Een bepaalde binding kan een willekeurig aantal protocolbindingselementen bevatten, die elk overnemen van BindingElement. Windows Communication Foundation (WCF) bevat verschillende protocolbindingselementen, waaronder de ReliableSessionBindingElement en de SymmetricSecurityBindingElement.
Bindingselement coderen: deze elementen vertegenwoordigen transformaties tussen een bericht en een codering die gereed is voor verzending op de draad. Typische WCF-bindingen bevatten precies één coderingsbindingselement. Voorbeelden van bindingselementen voor codering zijn onder andere de MtomMessageEncodingBindingElement, de BinaryMessageEncodingBindingElementen de TextMessageEncodingBindingElement. Als er geen bindingselement voor codering is opgegeven voor een binding, wordt een standaardcodering gebruikt. De standaardwaarde is tekst wanneer het transport HTTP en binair is, anders.
Transportbindingselement : deze elementen vertegenwoordigen de verzending van een coderingsbericht op een transportprotocol. Typische WCF-bindingen bevatten precies één transportbindingselement, dat overneemt van TransportBindingElement. Voorbeelden van transportbindingselementen zijn de TcpTransportBindingElement, de HttpTransportBindingElementen de NamedPipeTransportBindingElement.
Bij het maken van nieuwe bindingen is de volgorde van de toegevoegde bindingselementen belangrijk. Voeg altijd bindingselementen toe in de volgende volgorde:
Laag | Opties | Vereist |
---|---|---|
Transactiestroom | System.ServiceModel.Channels.TransactionFlowBindingElement | Nee |
Betrouwbaarheid | System.ServiceModel.Channels.ReliableSessionBindingElement | Nee |
Beveiliging | System.ServiceModel.Channels.SecurityBindingElement | Nee |
Samengesteld dubbelzijdig | System.ServiceModel.Channels.CompositeDuplexBindingElement | Nee |
Codering | Tekst, Binair, MTOM, Aangepast | Ja* |
Transport | TCP, Named Pipes, HTTP, HTTPS, MSMQ, Custom | Ja |
*Omdat voor elke binding een codering is vereist, voegt WCF een standaardcodering voor u toe als er geen codering is opgegeven. De standaardwaarde is Tekst/XML voor de HTTP- en HTTPS-transporten, en binair anders.
Een nieuw bindingselement maken
Naast de typen die zijn afgeleid van BindingElement die worden geleverd door WCF, kunt u uw eigen bindingselementen maken. Hiermee kunt u de manier aanpassen waarop de stapel bindingen wordt gemaakt en de onderdelen die erin gaan door uw eigen BindingElement bindingen te maken die kunnen worden samengesteld met de andere door het systeem geleverde typen in de stack.
Als u bijvoorbeeld een LoggingBindingElement
implementatie implementeert die de mogelijkheid biedt om het bericht te registreren bij een database, moet u het boven een transportkanaal in de kanaalstack plaatsen. In dit geval maakt de toepassing een aangepaste binding die de LoggingBindingElement
met TcpTransportBindingElement
is samengesteld, zoals in het volgende voorbeeld.
Binding customBinding = new CustomBinding(
new LoggingBindingElement(),
new TcpTransportBindingElement()
);
Hoe u uw nieuwe bindingselement schrijft, is afhankelijk van de exacte functionaliteit. Een van de voorbeelden, Transport: UDP, biedt een gedetailleerde beschrijving van het implementeren van één soort bindingselement.
Een nieuwe binding maken
Een door de gebruiker gemaakt bindingselement kan op twee manieren worden gebruikt. In de vorige sectie ziet u de eerste manier: via een aangepaste binding. Met een aangepaste binding kan de gebruiker een eigen binding maken op basis van een willekeurige set bindingselementen, waaronder door de gebruiker gemaakte bindingen.
Als u de binding in meer dan één toepassing gebruikt, maakt u uw eigen binding en breidt u de Bindingbinding uit. Dit voorkomt dat u handmatig een aangepaste binding maakt telkens wanneer u deze wilt gebruiken. Met een door de gebruiker gedefinieerde binding kunt u het gedrag van de binding definiëren en door de gebruiker gedefinieerde bindingselementen opnemen. En het is vooraf verpakt: u hoeft de binding niet telkens opnieuw te bouwen wanneer u deze gebruikt.
Een door de gebruiker gedefinieerde binding moet minimaal de CreateBindingElements methode en de Scheme eigenschap implementeren.
De CreateBindingElements methode retourneert een nieuwe BindingElementCollection die de bindingselementen voor de binding bevat. De verzameling is geordend en moet eerst de protocolbindingselementen bevatten, gevolgd door het coderingsbindingselement, gevolgd door het transportbindingselement. Wanneer u de door het WCF-systeem geleverde bindingselementen gebruikt, moet u de regels voor het ordenen van bindingselementen volgen die zijn opgegeven in aangepaste bindingen. Deze verzameling mag nooit verwijzen naar objecten waarnaar wordt verwezen binnen de door de gebruiker gedefinieerde bindingsklasse; bijgevolg moeten bindende auteurs een Clone()
van de BindingElementCollection bij elke aanroep aanroepen retourneren CreateBindingElements.
De Scheme eigenschap vertegenwoordigt het URI-schema voor het transportprotocol dat wordt gebruikt voor de binding. De WSHttpBinding en netTcpBinding retourneren bijvoorbeeld 'http' en 'net.tcp' uit hun respectieve Scheme eigenschappen.
Zie voor een volledige lijst met optionele methoden en eigenschappen voor door de gebruiker gedefinieerde bindingen Binding.
Opmerking
In dit voorbeeld wordt profielbinding geïmplementeerd SampleProfileUdpBinding
, die is afgeleid van Binding. De SampleProfileUdpBinding
bevat maximaal vier bindingselementen erin: één door de gebruiker gemaakte UdpTransportBindingElement
; en drie door het systeem geleverde: TextMessageEncodingBindingElement
, CompositeDuplexBindingElement
en 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();
}
Beveiligingsbeperkingen met dubbelzijdige contracten
Niet alle bindingselementen zijn compatibel met elkaar. Er gelden met name enkele beperkingen voor beveiligingsbindingselementen bij gebruik met dubbelzijdige contracten.
Beveiliging met één shot
U kunt 'één shot'-beveiliging implementeren, waarbij alle benodigde beveiligingsreferenties in één bericht worden verzonden door het negotiateServiceCredential
kenmerk van het <berichtconfiguratie-element> in te stellen op false
.
Eenmalige verificatie werkt niet met dubbelzijdige contracten.
Voor request-reply-contracten werkt eenmalige verificatie alleen als de bindingsstack onder het beveiligingsbindingselement ondersteuning biedt voor het maken of IRequestSessionChannel uitvoeren van exemplarenIRequestChannel.
Voor eenrichtingscontracten werkt eenmalige verificatie als de bindingsstack onder het beveiligingsbindingselement ondersteuning biedt voor het makenIRequestChannel, IRequestSessionChannelIOutputChannel of IOutputSessionChannel exemplaren.
Beveiligingstokens in de cookiemodus
Beveiligingscontexttokens in de cookiemodus kunnen niet worden gebruikt met dubbelzijdige contracten.
Voor request-reply-contracten werken beveiligingscontexttokens in de cookiemodus alleen als de bindingsstack onder het beveiligingsbindingselement ondersteuning biedt voor het maken of maken van IRequestSessionChannel exemplarenIRequestChannel.
Voor contracten in één richting werkt de beveiligingscontexttokens in de cookiemodus als de bindingsstack onder het beveiligingsbindingselement ondersteuning biedt voor het maken of maken van IRequestSessionChannel exemplarenIRequestChannel.
Beveiligingstokens in sessiemodus
SCT in de sessiemodus werkt voor dubbelzijdige contracten als de bindingsstack onder het beveiligingsbindingselement ondersteuning biedt voor het maken of IDuplexSessionChannel uitvoeren IDuplexChannel van exemplaren.
Sct in de sessiemodus werkt voor request-reply-contracten als de bindingsstack onder het beveiligingsbindingselement ondersteuning biedt voor het makenIDuplexChannel, IDuplexSessionChannelIRequestChannel of het maken van, of IRequestSessionChannel, exemplaren.
SCT in de sessiemodus werkt voor contracten in één richting als de bindingsstack onder het beveiligingsbindingselement ondersteuning biedt voor het makenIDuplexChannel, IDuplexSessionChannelIRequestChannel of IRequestSessionChannel exemplaren.
Afgeleid van een standaardbinding
In plaats van een geheel nieuwe bindingsklasse te maken, is het mogelijk om een van de bestaande door het systeem geleverde bindingen uit te breiden. Net als in het voorgaande geval moet u de CreateBindingElements methode en de Scheme eigenschap overschrijven.