Delen via


Overzicht van kanaalmodel

De WCF-kanaalstack (Windows Communication Foundation) is een gelaagde communicatiestack met een of meer kanalen die berichten verwerken. Onderaan de stack bevindt zich een transportkanaal dat verantwoordelijk is voor het aanpassen van de kanaalstack aan het onderliggende transport (bijvoorbeeld TCP, HTTP, SMTP en andere transporttypen).) Kanalen bieden een programmeermodel op laag niveau voor het verzenden en ontvangen van berichten. Dit programmeermodel is afhankelijk van verschillende interfaces en andere typen die gezamenlijk bekend staan als het WCF-kanaalmodel. In dit onderwerp worden kanaalshapes besproken, de bouw van een basiskanaallistener (op de service) en kanaalfactory (op de client).

Kanaalstack

WCF-eindpunten communiceren met de wereld met behulp van een communicatiestack genaamd de kanaalstack. In het volgende diagram wordt de kanaalstack vergeleken met andere communicatiestacks, bijvoorbeeld TCP/IP.

Channel Model

Ten eerste, de overeenkomsten: In beide gevallen biedt elke laag van de stapel enige abstractie van de wereld onder die laag en die abstractie alleen zichtbaar voor de laag direct erboven. Elke laag maakt gebruik van de abstractie van alleen de laag direct eronder. In beide gevallen communiceert elke laag ook met de bijbehorende laag in de andere stack, bijvoorbeeld de IP-laag met de IP-laag en de TCP-laag met de TCP-laag, enzovoort.

Nu, de verschillen: hoewel de TCP-stack is ontworpen om een abstractie van het fysieke netwerk te bieden, is de kanaalstack ontworpen om niet alleen een abstractie te bieden van de manier waarop het bericht wordt bezorgd, dat wil gezegd het transport, maar ook andere functies, zoals wat zich in het bericht bevindt of welk protocol wordt gebruikt voor communicatie, inclusief het vervoer, maar veel meer dan dat. Een betrouwbaar sessiebindingselement maakt bijvoorbeeld deel uit van de kanaalstack, maar bevindt zich niet onder het transport of het transport zelf. Deze abstractie wordt bereikt door het onderste kanaal in de stack te vereisen om het onderliggende transportprotocol aan te passen aan de kanaalstackarchitectuur en vervolgens te vertrouwen op kanalen verderop in de stack om communicatiefuncties zoals betrouwbaarheidsgaranties en beveiliging te bieden.

Berichten stromen door de communicatiestack als Message objecten. Zoals in afbeelding hierboven wordt weergegeven, wordt het onderste kanaal een transportkanaal genoemd. Het is het kanaal dat verantwoordelijk is voor het verzenden en ontvangen van berichten naar en van andere partijen. Dit omvat de verantwoordelijkheid van het transformeren van het Message object naar en van de indeling die wordt gebruikt om met andere partijen te communiceren. Boven het transportkanaal kunnen er elk gewenst aantal protocolkanalen zijn die verantwoordelijk zijn voor het leveren van een communicatiefunctie, zoals betrouwbare leveringsgaranties. Protocolkanalen werken op berichten die er doorheen stromen in de vorm van het Message object. Ze transformeren het bericht meestal, bijvoorbeeld door kopteksten toe te voegen of de hoofdtekst te versleutelen, of hun eigen protocolbeheerberichten te verzenden en te ontvangen, bijvoorbeeld ontvangstbevestigingen.

Kanaalshapes

Elk kanaal implementeert een of meer interfaces, ook wel kanaalshapes of kanaalshapes genoemd. Deze kanaalshapes bieden de communicatiegerichte methoden, zoals verzenden en ontvangen of aanvragen en beantwoorden die het kanaal implementeert en de gebruiker van de kanaalaanroepen. Aan de basis van de kanaalshapes bevindt zich de IChannel interface, een interface die een GetProperty<T-methode> biedt die is bedoeld als een gelaagd mechanisme voor toegang tot willekeurige functies die door kanalen in de stack worden weergegeven. De vijf kanaalshapes die worden uitgebreid IChannel , zijn:

Verder heeft elk van deze shapes een equivalent dat uitbreidt System.ServiceModel.Channels.ISessionChannel<TSession> tot ondersteuningssessies. De volgende stappen moeten worden uitgevoerd:

De kanaalshapes zijn gepatroont na enkele van de fundamentele berichtuitwisselingspatronen die worden ondersteund door bestaande transportprotocollen. Berichten in één richting komen bijvoorbeeld overeen met een IInputChannelIOutputChannel/paar, een aanvraag-antwoord komt overeen met/IRequestChannelIReplyChannel paren en dubbelzijdige communicatie komt overeen met IDuplexChannel (die zowel IOutputChannelIInputChannel als ).

Programmeren met de kanaalstack

Kanaalstacks worden doorgaans gemaakt met behulp van een fabriekspatroon waarbij een binding de kanaalstack maakt. Aan de verzendzijde wordt een binding gebruikt om een ChannelFactory, die op zijn beurt een kanaalstack bouwt en een verwijzing naar het bovenste kanaal in de stack retourneert. De toepassing kan dit kanaal vervolgens gebruiken om berichten te verzenden. Zie Programmeren op clientkanaalniveau voor meer informatie.

Aan de ontvangstzijde wordt een binding gebruikt om een IChannelListener, die luistert naar binnenkomende berichten, te bouwen. Het IChannelListener biedt berichten aan de luistertoepassing door kanaalstacks te maken en de toepassingsverwijzing naar het bovenste kanaal te geven. De toepassing gebruikt dit kanaal vervolgens om binnenkomende berichten te ontvangen. Zie Programmeren op servicekanaalniveau voor meer informatie.

Het kanaalobjectmodel

Het kanaalobjectmodel is de kernset interfaces die nodig zijn voor het implementeren van kanalen, kanaallisteners en kanaalfactory's. Er zijn ook enkele basisklassen beschikbaar om u te helpen bij aangepaste implementaties.

Kanaallisteners zijn verantwoordelijk voor het luisteren naar inkomende berichten en leveren ze vervolgens aan de laag hierboven via kanalen die door de kanaallistener zijn gemaakt.

Kanaalfactory's zijn verantwoordelijk voor het maken van kanalen die worden gebruikt voor het verzenden van berichten en voor het sluiten van alle kanalen die ze hebben gemaakt wanneer de kanaalfactory wordt gesloten.

ICommunicationObject is de kerninterface die de basisstatusmachine definieert die door alle communicatieobjecten wordt geïmplementeerd. CommunicationObject biedt een implementatie van deze kerninterface die andere kanaalklassen kunnen afleiden van in plaats van de interface opnieuw te implementeren. Dit is echter niet vereist: een aangepast kanaal kan rechtstreeks implementeren ICommunicationObject en niet overnemen van CommunicationObject. Geen van de klassen in afbeelding 3 wordt beschouwd als onderdeel van het kanaalmodel; het zijn helpers die beschikbaar zijn voor aangepaste kanaal implementeerfuncties die kanalen willen bouwen.

Channel model

In de volgende onderwerpen worden het kanaalobjectmodel en verschillende ontwikkelgebieden beschreven waarmee u aangepaste kanalen kunt bouwen.

Onderwerp Beschrijving
Service: Kanaallisteners en -kanalen Beschrijft kanaallisteners, die luisteren naar inkomende kanalen in een servicetoepassing.
Client: Kanaalfactory's en kanalen Beschrijft kanaalfactory's, waarmee kanalen worden gemaakt om verbinding te maken met een servicetoepassing.
Statuswijzigingen begrijpen Hierin wordt beschreven hoe de status van de System.ServiceModel.ICommunicationObject interfacemodellen in kanalen verandert.
Een Berichtuitwisselingspatroon kiezen Beschrijft de zes basispatronen voor het uitwisselen van berichten die kanalen kunnen ondersteunen.
Afhandeling van uitzonderingen en fouten Hierin wordt beschreven hoe u fouten en uitzonderingen in aangepaste kanalen kunt afhandelen.
Ondersteuning voor configuratie en metagegevens Hierin wordt beschreven hoe u het gebruik van aangepaste kanalen vanuit het toepassingsmodel ondersteunt en hoe u metagegevens exporteert en importeert met behulp van bindingen en bindingselementen.