Aangepaste coderingsprogramma's
In dit onderwerp wordt beschreven hoe u aangepaste coderingsprogramma's maakt.
In Windows Communication Foundation (WCF) gebruikt u een binding om op te geven hoe gegevens moeten worden overgedragen over een netwerk tussen eindpunten. Een binding bestaat uit een reeks bindingselementen. Een binding bevat optionele protocolbindingselementen zoals beveiliging, een vereist message encoder-bindingselement en een vereist transportbindingselement. Een berichtcoderingsprogramma wordt vertegenwoordigd door een bindingselement voor berichtcodering. Er zijn drie berichtcoderingsprogramma's opgenomen in WCF: Binary, Message Transmission Optimization Mechanism (MTOM) en Text.
Een bindingselement voor berichtcodering serialiseert een uitgaande Message en geeft deze door aan het transport, of ontvangt de geserialiseerde vorm van een bericht van het transport en geeft het door aan de protocollaag indien aanwezig, of aan de toepassing, indien niet aanwezig.
Berichtencoderingsprogramma's transformeren Message exemplaren van en naar een draadweergave. Hoewel encoders worden beschreven als boven de transportlaag in de kanaalstack, bevinden ze zich in de transportlaag. Transporten (bijvoorbeeld HTTP) maken het bericht op basis van de vereisten van de transportstandaard. Coderingsprogramma's (bijvoorbeeld Tekst-XML) coderen het bericht.
Wanneer u verbinding maakt met een bestaande client of server, hebt u mogelijk geen keuze over het gebruik van een bepaalde berichtcodering. WCF-services kunnen echter toegankelijk worden gemaakt via meerdere eindpunten, elk met een andere berichtcoderingsprogramma. Wanneer één encoder niet de volledige doelgroep voor uw service omvat, kunt u overwegen om uw service beschikbaar te maken via meerdere eindpunten. Clienttoepassingen kunnen vervolgens het eindpunt kiezen dat het beste voor hen is. Met behulp van meerdere eindpunten kunt u de voordelen van verschillende berichtcoderingsprogramma's combineren met andere bindingselementen.
Door het systeem geleverde coderingsprogramma's
WCF biedt verschillende door het systeem geleverde bindingen die zijn ontworpen om de meest voorkomende toepassingsscenario's te behandelen. Elk van deze bindingen combineert een transport-, berichtcoderingsprogramma en andere opties (bijvoorbeeld beveiliging). In dit onderwerp wordt beschreven hoe u de Text
coderingsprogramma's voor MTOM
berichten Binary
uitbreidt die zijn opgenomen in WCF of hoe u uw eigen aangepaste encoder maakt. De coderingsprogramma voor tekstberichten ondersteunt zowel xml-codering zonder opmaak als SOAP-coderingen. De xml-coderingsmodus zonder opmaak van de coderingsmodus voor tekstberichten wordt de POX-coderingsprogramma ('Oude XML zonder opmaak') genoemd om deze te onderscheiden van de soap-codering op basis van tekst.
Zie de bijbehorende sectie in Het kiezen van een transport voor meer informatie over de combinaties van bindingen die door het systeem worden geleverd.
Werken met door het systeem geleverde coderingsprogramma's
Een codering wordt toegevoegd aan een binding met behulp van een klasse die is afgeleid van MessageEncodingBindingElement.
WCF biedt de volgende typen bindingselementen die zijn afgeleid van de MessageEncodingBindingElement klasse die kan voorzien in tekst-, binaire en MTOM-codering (Message Transmission Optimization Mechanism):
TextMessageEncodingBindingElement: De meest interoperabele, maar de minst efficiënte encoder voor XML-berichten. Een webservice- of webserviceclient kan over het algemeen tekstuele XML begrijpen. Het verzenden van grote blokken binaire gegevens omdat tekst niet efficiënt is.
BinaryMessageEncodingBindingElement: Vertegenwoordigt het bindingselement dat het tekencoderings- en berichtversiebeheer specificeert dat wordt gebruikt voor XML-berichten op basis van binaire bestanden. Dit is het meest efficiënt van de coderingsopties, maar het minst interoperabel, omdat deze alleen wordt ondersteund door WCF-eindpunten.
MtomMessageEncodingBindingElement: Vertegenwoordigt het bindingselement dat het tekencoderings- en berichtversiebeheer aangeeft dat wordt gebruikt voor een bericht met behulp van een MTOM-codering (Message Transmission Optimization Mechanism). MTOM is een efficiënte technologie voor het verzenden van binaire gegevens in WCF-berichten. De MTOM-encoder probeert een balans te vinden tussen efficiëntie en interoperabiliteit. De MTOM-codering verzendt de meeste XML in tekstvorm, maar optimaliseert grote blokken binaire gegevens door ze ongewijzigd te verzenden, zonder conversie naar tekst.
Het bindingselement maakt een binair, MTOM of tekst MessageEncoderFactory. De factory maakt een binair, MTOM- of tekstexemplaren MessageEncoderFactory . Normaal gesproken is er slechts één exemplaar. Als er echter sessies worden gebruikt, kan er een andere encoder worden verstrekt aan elke sessie. De binaire encoder maakt hiervan gebruik om dynamische woordenlijsten te coördineren (zie XML-infrastructuur).
De ReadMessage en WriteMessage methoden vormen de kern van de encoders. De methoden bieden voor het lezen van een bericht uit een stroom of uit een Byte matrix. Bytematrices worden gebruikt wanneer het transport wordt uitgevoerd in de buffermodus. Berichten worden altijd naar streams geschreven. Als het transport het bericht moet bufferen, biedt het een stroom die de buffering doet.
De rest van de leden werken met ondersteuningsinhoud, mediatypen en MessageVersion. Het transport roept deze coderingsmethoden aan om te testen of het binnenkomende bericht hiermee kan worden gedecodeerd of om te bepalen of het uitgaande bericht geldig is voor deze encoder.
Elk van de drie coderingsprogramma-implementaties voegt eigenschappen toe die relevant zijn voor de specifieke coderingen en is volledig configureerbaar. De coderingsprogramma's bieden ook lezerquota met beveiligde standaardinstellingen. Zie XML-infrastructuur voor een bespreking van de quota.
Functies van door het systeem geleverde encoders
Er zijn een aantal functies van de door het systeem geleverde encoders.
In een groep plaatsen
Elk van de encoder-implementaties probeert zoveel mogelijk te groeperen. Het verminderen van toewijzingen is een belangrijke manier om de prestaties van beheerde code te verbeteren. Voor dit groeperen gebruiken de implementaties de SynchronizedPool
klasse. Het C#-bestand bevat een beschrijving van de aanvullende optimalisaties die door deze klasse worden gebruikt.
XmlDictionaryReader en XmlDictionaryWriter exemplaren worden gegroepeerd en opnieuw geïnitialiseerd om te voorkomen dat nieuwe exemplaren voor elk bericht worden toegewezen. Voor de lezers maakt een OnClose
callback de lezer vrij wanneer Close()
deze wordt aangeroepen. De encoder recyclet ook enkele berichtstatusobjecten die worden gebruikt bij het samenstellen van berichten. De grootte van deze pools kan worden geconfigureerd door de MaxReadPoolSize
en MaxWritePoolSize
eigenschappen van elk van de drie klassen die zijn afgeleid van MessageEncodingBindingElement.
Binaire codering
Wanneer binaire codering sessies gebruikt, moet de dynamische woordenlijsttekenreeks worden gecommuniceerd naar de ontvanger van het bericht. Dit wordt gedaan door het bericht vooraf te voegen met de dynamische woordenlijsttekenreeksen. De ontvanger verwijdert de tekenreeksen, voegt deze toe aan de sessie en verwerkt het bericht. Voor het correct doorgeven van woordenlijsttekenreeksen moet het transport worden gebufferd.
De tekenreeksen worden door een interne AddSessionInformationToMessage
methode aan het bericht toegevoegd. Hiermee worden de tekenreeksen als UTF-8 toegevoegd aan het voorvoegsel van het bericht met hun lengte. De volledige woordenlijstkop wordt vervolgens voorafgegaan door de lengte van de gegevens. De omgekeerde bewerking wordt uitgevoerd door een interne ExtractSessionInformationFromMessage
methode.
Naast het verwerken van dynamische woordenlijstsleutels, worden gebufferde sessieful berichten op een unieke manier ontvangen. In plaats van een lezer over het document te maken en te verwerken, gebruikt de binaire coderingsprogramma de interne MessagePatterns
klasse om de binaire stroom te deconstrueren. Het idee is dat de meeste berichten een bepaalde set kopteksten hebben die in een bepaalde volgorde worden weergegeven wanneer ze worden gegenereerd door WCF. Het patroonsysteem breekt het bericht uit elkaar op basis van wat het verwacht. Als dit lukt, wordt een MessageHeaders object geïnitialiseerd zonder de XML te parseren. Zo niet, dan valt deze terug op de standaardmethode.
MTOM-codering
De MtomMessageEncodingBindingElement klasse heeft een extra configuratie-eigenschap met de naam MaxBufferSize. Hiermee wordt een bovengrens geplaatst voor hoeveel gegevens het mag bufferen tijdens het lezen van een bericht. De XML-gegevensset (Infoset) of andere MIME-onderdelen moeten mogelijk worden gebufferd om alle MIME-onderdelen opnieuw in één bericht samen te voegen.
Om correct te werken met HTTP, biedt de interne MTOM-berichtcoderingsklasse enkele interne API's voor GetContentType
(die ook intern is) en WriteMessage
, wat openbaar is en kan worden overschreven. Er moet meer communicatie plaatsvinden om ervoor te zorgen dat waarden in de HTTP-headers overeenkomen met waarden in de MIME-headers.
Intern maakt de MTOM-berichtcoderingsprogramma gebruik van de tekstlezers van WCF en is vergelijkbaar met de tekstcoderingsprogramma. Het belangrijkste verschil is dat het grote segmenten van binaire of binaire grote objecten (BLOBs) optimaliseert door ze niet te converteren naar Base-64-codering voordat ze worden ingesloten in de berichtbytes. In plaats daarvan worden deze BLOBs geëxtraheerd en waarnaar wordt verwezen als de MIME-bijlagen.
Uw eigen encoder schrijven
Als u uw eigen aangepaste berichtcoderingsprogramma wilt implementeren, moet u aangepaste implementaties van de volgende abstracte basisklassen opgeven:
Het converteren van de in-memory weergave van een bericht naar een weergave die naar een stroom kan worden geschreven, wordt ingekapseld in de MessageEncoder klasse, die fungeert als een fabriek voor XML-lezers en XML-schrijvers die ondersteuning bieden voor specifieke typen XML-coderingen.
De belangrijkste methoden van deze klasse die u moet overschrijven zijn:
WriteMessage waarmee een MessageEncodingBindingElement object wordt meegenomen en naar een Stream object wordt geschreven.
ReadMessage die een Stream object en een maximale koptekstgrootte heeft en een Message object retourneert.
Het is de code die u in deze methoden schrijft die de conversie tussen het standaardtransportprotocol en uw aangepaste codering afhandelt.
Vervolgens moet u een fabrieksklasse codeeren waarmee uw aangepaste encoder wordt gemaakt. Overschrijf het Encoder om een exemplaar van uw aangepaste MessageEncoderexemplaar te retourneren.
Verbind vervolgens uw aangepaste MessageEncoderFactory bestand met de bindingselementstack die wordt gebruikt om de service of client te configureren door de CreateMessageEncoderFactory methode te overschrijven om een exemplaar van deze factory te retourneren.
Er zijn twee voorbeelden van WCF die dit proces illustreren met voorbeeldcode: Custom Message Encoder: Custom Text Encoder en Custom Message Encoder: Compression Encoder.