Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Thema wird erläutert, wie benutzerdefinierte Encoder erstellt werden.
In Windows Communication Foundation (WCF) verwenden Sie eine Bindung , um anzugeben, wie Daten über ein Netzwerk zwischen Endpunkten übertragen werden. Eine Bindung besteht aus einer Abfolge von Bindungselementen. Eine Bindung enthält optionale Protokollbindungselemente wie Sicherheit, ein erforderliches Message Encoder-Bindungselement und ein erforderliches Transportbindungselement. Ein Nachrichten-Encoder wird durch ein Nachrichtencodierungsbindungselement dargestellt. Drei Nachrichten-Encoder sind in WCF enthalten: Binary, Message Transmission Optimization Mechanism (MTOM) und Text.
Ein Nachrichtencodierungsbindungselement serialisiert ein ausgehendes Message Element und übergibt es an den Transport, oder empfängt die serialisierte Form einer Nachricht vom Transport und übergibt es an die Protokollebene, falls vorhanden, oder an die Anwendung, falls nicht vorhanden.
Message-Instanzen werden von Nachrichtenencodern in und aus Übertragungsdarstellungen transformiert. Encoder werden zwar als oberhalb der Transportschicht im Kanalstapel liegend beschrieben, befinden sich aber tatsächlich innerhalb der Transportschicht. Transporte (z. B. HTTP) formatieren die Nachricht entsprechend den Anforderungen des Transportstandards. Encoder (z. B. Text-XML) codieren einfach die Nachricht.
Wenn Sie eine Verbindung mit einem bereits vorhandenen Client oder Server herstellen, haben Sie möglicherweise keine Wahl, eine bestimmte Nachrichtencodierung zu verwenden. Wcf-Dienste können jedoch über mehrere Endpunkte zugänglich gemacht werden, jeweils mit einem anderen Nachrichten-Encoder. Wenn ein einzelner Encoder die gesamte Zielgruppe für Ihren Dienst nicht abdeckt, erwägen Sie, Ihren Dienst über mehrere Endpunkte verfügbar zu machen. Clientanwendungen können dann den Endpunkt auswählen, der für sie am besten geeignet ist. Mithilfe mehrerer Endpunkte können Sie die Vorteile verschiedener Nachrichtengeber mit anderen Bindungselementen kombinieren.
Vom System bereitgestellte Encoder
WCF stellt mehrere vom System bereitgestellte Bindungen bereit, die für die gängigsten Anwendungsszenarien konzipiert sind. Jede dieser Bindungen kombiniert einen Transport-, Nachrichten-Encoder und andere Optionen (z. B. Sicherheit). In diesem Thema wird beschrieben, wie Sie die in WCF enthaltenen Nachrichten-Encoder Text, Binary und MTOM erweitern oder einen eigenen benutzerdefinierten Encoder erstellen. Der Textnachrichten-Encoder unterstützt sowohl eine einfache XML-Codierung als auch SOAP-Codierungen. Der einfache XML-Codierungsmodus des Textnachrichten-Encoders wird als POX-Encoder ("Plain Old XML") bezeichnet, um ihn von der textbasierten SOAP-Codierung zu unterscheiden.
Weitere Informationen zu den Kombinationen von Bindungselementen, die von den vom System bereitgestellten Bindungen bereitgestellt werden, finden Sie im entsprechenden Abschnitt in der Auswahl eines Transports.
So arbeiten Sie mit System-Provided Encodern
Einer Bindung wird eine Codierung mithilfe einer Klasse hinzugefügt, die von MessageEncodingBindingElement abgeleitet ist.
WCF stellt die folgenden Typen von Bindungselementen bereit, die von der MessageEncodingBindingElement Klasse abgeleitet werden, die text-, binäre und Message Transmission Optimization Mechanism (MTOM)-Codierung bereitstellen kann:
TextMessageEncodingBindingElement: Der interoperableste, aber am wenigsten effiziente Encoder für XML-Nachrichten. Ein Webdienst- oder Webdienstclient kann textbezogenes XML im Allgemeinen verstehen. Der Versand großer Binärdatenblöcke als Text ist jedoch nicht effizient.
BinaryMessageEncodingBindingElement: Stellt das Bindungselement dar, das die Zeichencodierung und die Nachrichtenversionsverwaltung angibt, die für binäre XML-Nachrichten verwendet wird. Dies ist die effizienteste Codierungsoptionen, aber die am wenigsten interoperable, da sie nur von WCF-Endpunkten unterstützt wird.
MtomMessageEncodingBindingElement: Stellt das Bindungselement dar, das die Zeichencodierung und die Nachrichtenversionsverwaltung angibt, die für eine Nachricht mit einer MTOM-Codierung (Message Transmission Optimization Mechanism) verwendet wird. MTOM ist eine effiziente Technologie zum Übertragen von Binärdaten in WCF-Nachrichten. Der MTOM-Encoder versucht, zwischen Effizienz und Interoperabilität zu gleichgewichten. Die MTOM-Kodierung überträgt den Großteil der XML-Daten in Textform, optimiert jedoch große Blöcke von Binärdaten, indem sie diese direkt als as-isüberträgt, ohne eine Konvertierung in Text vorzunehmen.
Das Bindungselement erstellt eine Binär-, MTOM- oder Textdatei MessageEncoderFactory. Von der Factory wird eine MessageEncoderFactory-Binär-, MTOM- oder Textinstanz erstellt. In der Regel gibt es nur eine einzelne Instanz. Wenn Sitzungen jedoch verwendet werden, kann jeder Sitzung ein anderer Encoder zugewiesen werden. Der Binäre Encoder verwendet dies, um dynamische Wörterbücher zu koordinieren (siehe XML-Infrastruktur).
Die Methoden ReadMessage und WriteMessage sind der Kern der Encoder. Die Methoden bieten das Lesen einer Nachricht aus einem Datenstrom oder aus einem Byte Array. Byte-Arrays werden verwendet, wenn der Transport im Puffermodus betrieben wird. Nachrichten werden stets in Streams geschrieben. Wenn der Transport die Nachricht puffern muss, wird ein Datenstrom bereitgestellt, der die Pufferung ausführt.
Die restlichen Member arbeiten mit Supportinhalten, Medientypen und MessageVersion. Der Transport ruft diese Encodermethoden auf, um zu testen, ob die eingehende Nachricht von ihr decodiert werden kann, oder um festzustellen, ob die ausgehende Nachricht für diesen Encoder gültig ist.
Jede der drei Encoderimplementierungen fügt Eigenschaften hinzu, die für die spezifischen Codierungen relevant sind und vollständig konfigurierbar sind. Von den Encodern werden überdies Readerkontingente mit sicheren Standardeinstellungen verfügbar gemacht. Eine Erläuterung der Kontingente finden Sie in der XML-Infrastruktur.
Features von System-Provided Encodern
Es gibt eine Reihe von Features, die von den vom System bereitgestellten Encodern bereitgestellt werden.
Bündelung
Jede der Encoderimplementierungen versucht, so viel wie möglich zu poolen. Das Reduzieren von Zuordnungen ist eine wichtige Möglichkeit, die Leistung von verwaltetem Code zu verbessern. Um diesen Pool zu erreichen, verwenden die Implementierungen die SynchronizedPool Klasse. Die C#-Datei enthält eine Beschreibung der zusätzlichen Optimierungen, die von dieser Klasse verwendet werden.
XmlDictionaryReader und XmlDictionaryWriter Instanzen werden in einem Pool zusammengefasst und neu initialisiert, um zu verhindern, dass für jede Nachricht neue Instanzen angelegt werden. Bei einem Reader wird dieser mithilfe eines OnClose-Rückrufs zurückgefordert, wenn Close() aufgerufen wird. Der Encoder recycelt auch einige Nachrichtenstatusobjekte, die zur Erstellung von Nachrichten dienen. Die Größen dieser Pools können durch die MaxReadPoolSize und MaxWritePoolSize-Eigenschaften für jede der drei von MessageEncodingBindingElement abgeleiteten Klassen konfiguriert werden.
Binäre Codierung
Wenn die binäre Codierung Sitzungen verwendet, muss die Zeichenfolge des dynamischen Wörterbuchs dem Empfänger der Nachricht mitgeteilt werden. Dazu stellen Sie der Nachricht die Zeichenfolgen des dynamischen Wörterbuchs voran. Der Empfänger entfernt die Zeichenfolgen, fügt sie der Sitzung hinzu und verarbeitet die Nachricht. Um Wörterbuch-Strings korrekt zu übergeben, muss der Transport gepuffert sein.
Die Zeichenfolgen werden von einer internen AddSessionInformationToMessage Methode an die Nachricht angefügt. Mit dieser Methode werden die Zeichenfolgen dem Nachrichtenanfang als UTF-8 hinzugefügt. Davor wird als Präfix die Länge der Zeichenfolgen eingefügt. Der gesamte Wörterbuchkopf wird dann der Länge der Daten vorangestellt. Der Reversevorgang wird von einer internen ExtractSessionInformationFromMessage Methode ausgeführt.
Zusätzlich zum Verarbeiten dynamischer Wörterbuchschlüssel erfolgt der Empfang sitzungsbasierter Meldungen auf eindeutige Weise. Anstatt einen Reader über das Dokument zu erstellen und es zu verarbeiten, verwendet der binäre Encoder die interne MessagePatterns Klasse, um den binären Datenstrom zu deconieren. Die Idee ist, dass die meisten Nachrichten einen bestimmten Satz von Kopfzeilen haben, die bei der Erstellung durch WCF in einer bestimmten Reihenfolge angezeigt werden. Das Mustersystem bricht die Nachricht auf der Grundlage ihrer Erwartungen auseinander. Wenn es erfolgreich ist, initialisiert es ein MessageHeaders Objekt, ohne den XML-Code zu analysieren. Wenn dies nicht der Fall ist, fällt sie auf die Standardmethode zurück.
MTOM-Codierung
Die MtomMessageEncodingBindingElement Klasse verfügt über eine zusätzliche Konfigurationseigenschaft namens MaxBufferSize. Dadurch wird eine obere Grenze für die Anzahl der Daten platziert, die beim Lesen einer Nachricht gepuffert werden dürfen. Der XML-Informationssatz (Infoset) oder andere MIME-Teile müssen möglicherweise gepuffert werden, um alle MIME-Teile in einer einzelnen Nachricht neu zusammenzusetzen.
Um mit HTTP ordnungsgemäß zu arbeiten, stellt die interne MTOM-Nachrichten-Encoderklasse einige interne APIs bereit für GetContentType (die auch intern ist) und WriteMessage, die öffentlich ist und überschrieben werden kann. Es muss mehr Kommunikation erfolgen, um sicherzustellen, dass Werte in den HTTP-Headern den Werten in den MIME-Headern entsprechen.
Intern verwendet der MTOM-Nachrichten-Encoder WCF-Textleser und ähnelt dem Text-Encoder. Der Hauptunterschied besteht darin, dass große binäre Blöcke oder "Binary Large Objects" (BLOBs) optimiert werden, indem sie nicht in Base-64-Kodierung konvertiert werden, bevor sie in die Nachrichtenbytes eingebettet werden. Stattdessen bleiben diese BLOBs extrahiert und werden als MIME-Anhänge referenziert.
Einen Encoder selbst schreiben
Um Ihren eigenen benutzerdefinierten Nachrichten-Encoder zu implementieren, müssen Sie benutzerdefinierte Implementierungen der folgenden abstrakten Basisklassen bereitstellen:
Die Konvertierung aus der Speicherdarstellung einer Nachricht in eine Darstellung, die in einen Datenstrom geschrieben werden kann, ist in der MessageEncoder Klasse gekapselt, die als Factory für XML-Leser und XML-Autoren dient, die bestimmte Typen von XML-Codierungen unterstützen.
Die wichtigsten Methoden dieser Klasse, die Sie außer Kraft setzen müssen, sind:
WriteMessage nimmt ein MessageEncodingBindingElement Objekt und schreibt es in ein Stream Objekt.
ReadMessage, das ein Stream Objekt und eine maximale Kopfzeilengröße annimmt und ein Message Objekt zurückgibt.
Es handelt sich um den Code, den Sie in diesen Methoden schreiben, der die Konvertierung zwischen dem Standardtransportprotokoll und der angepassten Codierung behandelt.
Als Nächstes müssen Sie eine Factoryklasse codieren, die Ihren benutzerdefinierten Encoder erstellt. Überschreiben Sie den Encoder, um eine Instanz des benutzerdefinierten MessageEncoder zurückzugeben.
Verbinden Sie anschließend die benutzerdefinierte MessageEncoderFactory mit dem Bindungselementstapel für die Konfiguration des Diensts oder des Clients durch Überschreiben der CreateMessageEncoderFactory-Methode, um eine Instanz der Factory zurückzugeben.
Es gibt zwei Beispiele mit WCF, die diesen Prozess mit Beispielcode veranschaulichen: Custom Message Encoder: Custom Text Encoder and Custom Message Encoder: Compression Encoder.