Sdílet prostřednictvím


Vlastní kodéry

Toto téma popisuje, jak vytvářet vlastní kodéry.

Ve Windows Communication Foundation (WCF) použijete vazbu k určení způsobu přenosu dat přes síť mezi koncovými body. Vazba se skládá z posloupnosti vazeb prvků. Vazba zahrnuje volitelné elementy vazby protokolu, jako je zabezpečení, požadovaný element vazby Kodéru zpráv a požadovaný prvek vazby přenosu. Kodér zpráv je reprezentován elementem vazby kódování zpráv. Do WCF jsou zahrnuty tři kodéry pro kódování zpráv: binární, mechanismus optimalizace přenosu zpráv (MTOM) a text.

Element vazby kódování zprávy serializuje odchozí Message a předá ho do přenosu, nebo přijme serializovanou formu zprávy z přenosu a předá ji do vrstvy protokolu, pokud je k dispozici, nebo do aplikace, pokud není k dispozici.

Kodéry zpráv transformují Message instance do a z reprezentace drátu. I když jsou kodéry popsané jako nad vrstvou přenosu v zásobníku kanálu, nacházejí se uvnitř přenosové vrstvy. Přenosy (například HTTP) formátují zprávu podle požadavků přenosového standardu. Kodéry (například Text Xml) jednoduše kódují zprávu.

Při připojování k existujícímu klientovi nebo serveru možná nemáte na výběr použití konkrétního kódování zpráv. Služby WCF je ale možné zpřístupnit prostřednictvím několika koncových bodů, z nichž každý má jiný kodér zpráv. Pokud jeden kodér nepokrývá celou cílovou skupinu vaší služby, zvažte zveřejnění služby přes více koncových bodů. Klientské aplikace pak můžou zvolit koncový bod, který je pro ně nejvhodnější. Použití více koncových bodů umožňuje kombinovat výhody různých kodérů zpráv s jinými prvky vazby.

Kodéry poskytované systémem

WCF poskytuje několik systémově poskytovaných vazeb, které jsou navržené tak, aby zahrnovaly nejběžnější scénáře aplikací. Každá z těchto vazeb kombinuje přenos, kodér zpráv a další možnosti (například zabezpečení). Toto téma popisuje, jak rozšířit Textkodéry , Binarya MTOM kodéry zpráv, které jsou součástí WCF, nebo vytvořit vlastní kodér. Kodér textových zpráv podporuje prosté kódování XML i kódování SOAP. Režim kódování prostého KÓDU XML kodéru textových zpráv se nazývá kodér POX ("Plain Old XML") k rozlišení od kódování SOAP založeného na textu.

Další informace o kombinacích vazeb poskytovaných systémovými vazbami naleznete v odpovídající části Volby přenosu.

Práce s kodéry poskytovanými systémem

Kódování je přidáno do vazby pomocí třídy odvozené z MessageEncodingBindingElement.

WCF poskytuje následující typy vazeb prvků odvozených z MessageEncodingBindingElement třídy, které mohou poskytnout pro kódování text, binární a message transmission optimization mechanism (MTOM):

  • TextMessageEncodingBindingElement: Nejoperabilní, ale nejméně efektivní kodér pro zprávy XML. Klient webové služby nebo webové služby může obecně rozumět textovému kódu XML. Přenos velkých bloků binárních dat, protože text není efektivní.

  • BinaryMessageEncodingBindingElement: Představuje element vazby, který určuje kódování znaků a správu verzí zpráv používané pro binární zprávy XML. To je nejúčinnější z možností kódování, ale nejméně interoperabilní, protože je podporován pouze koncovými body WCF.

  • MtomMessageEncodingBindingElement: Představuje element vazby, který určuje kódování znaků a správu verzí zpráv používané pro zprávu pomocí kódování MTOM (Message Transmission Optimization Mechanism). MTOM je efektivní technologie pro přenos binárních dat ve zprávách WCF. Kodér MTOM se pokouší vyvážit mezi efektivitou a interoperabilitou. Kódování MTOM přenáší většinu XML v textové podobě, ale optimalizuje velké bloky binárních dat tak, že je přenáší tak, jak je, bez převodu na text.

Element vazby vytvoří binární, MTOM nebo text MessageEncoderFactory. Objekt pro vytváření vytvoří binární instanci, MTOM nebo textovou MessageEncoderFactory instanci. Obvykle existuje pouze jedna instance. Pokud se ale používají relace, může být pro každou relaci k dispozici jiný kodér. Binární kodér tuto funkci používá ke koordinaci dynamických slovníků (viz infrastruktura XML).

Základem ReadMessage kodérů jsou metody a WriteMessage metody. Metody poskytují čtení zprávy z datového proudu nebo z Byte pole. Pole bajtů se používají při provozu přenosu v režimu vyrovnávací paměti. Zprávy se vždy zapisují do datových proudů. Pokud přenos musí zprávu ukládat do vyrovnávací paměti, poskytuje datový proud, který provádí ukládání do vyrovnávací paměti.

Zbývající členové pracují s obsahem podpory, typy médií a MessageVersion. Přenos volá tyto metody kodéru k otestování, zda je možné příchozí zprávu dekódovat, nebo určit, jestli je odchozí zpráva pro tento kodér platná.

Každá ze tří implementací kodéru přidává vlastnosti, které jsou relevantní pro konkrétní kódování a jsou plně konfigurovatelné. Kodéry také zveřejňují kvóty pro čtení, které mají zabezpečené výchozí hodnoty. Informace o kvótách najdete v tématu Infrastruktura XML.

Funkce kodérů poskytovaných systémem

Kodéry poskytované systémem poskytují řadu funkcí.

Sdružování

Každá z implementací kodéru se snaží co nejvíce fondovat. Snížení přidělení je klíčovým způsobem, jak zlepšit výkon spravovaného kódu. K tomuto sdružování používají SynchronizedPool implementace třídu. Soubor C# obsahuje popis dalších optimalizací používaných touto třídou.

XmlDictionaryReader a XmlDictionaryWriter instance jsou ve fondu a znovu inicializovány, aby se zabránilo přidělování nových instancí pro každou zprávu. Pro čtenáře OnClose zpětné volání uvolní čtenáře při Close() volání. Kodér také recykluje některé objekty stavu zpráv používané při vytváření zpráv. Velikosti těchto fondů lze konfigurovat pomocí MaxReadPoolSize vlastností každé MaxWritePoolSize ze tří tříd odvozených z MessageEncodingBindingElement.

Binární kódování

Pokud binární kódování používá relace, musí být řetězec dynamického slovníku předán příjemci zprávy. K tomu slouží předpona zprávy pomocí dynamických řetězců slovníku. Příjemce odstraní řetězce, přidá je do relace a zpracuje zprávu. Správné předávání řetězců slovníku vyžaduje uložení přenosu do vyrovnávací paměti.

Řetězce jsou k zprávě připojeny interní AddSessionInformationToMessage metodou. Přidá řetězce jako UTF-8 na přední straně zprávy s předponou jejich délky. Celé záhlaví slovníku je pak předponou s délkou dat. Reverzní operace se provádí interní ExtractSessionInformationFromMessage metodou.

Kromě zpracování dynamických klíčů slovníku se zprávy s vyrovnávací pamětí přijímají jedinečným způsobem. Místo vytvoření čtečky dokumentu a jeho zpracování binární kodér používá interní MessagePatterns třídu k dekonstrukci binárního streamu. Myšlenka spočívá v tom, že většina zpráv má určitou sadu hlaviček, které se zobrazují v určitém pořadí při generování WCF. Systém vzorů rozdělí zprávu na základě toho, co očekává. Pokud je úspěšný, inicializuje MessageHeaders objekt bez analýzy XML. Pokud ne, vrátí se do standardní metody.

Kódování MTOM

Třída MtomMessageEncodingBindingElement má další vlastnost konfigurace s názvem MaxBufferSize. Tím se umístí horní mez toho, kolik dat je povoleno ukládat do vyrovnávací paměti během procesu čtení zprávy. Sada informací XML (Infoset) nebo jiné části MIME může být potřeba ukládat do vyrovnávací paměti, aby se všechny části MIME znovu sesestavily do jedné zprávy.

Aby bylo možné správně pracovat s protokolem HTTP, poskytuje třída interního kodéru zpráv MTOM některá interní rozhraní API pro GetContentType (což je také interní) a WriteMessagekterá je veřejná a lze ji přepsat. Aby se zajistilo, že hodnoty v hlavičce HTTP souhlasí s hodnotami v hlavičkách MIME, musí dojít k další komunikaci.

Kodér zpráv MTOM interně používá čtečky textu WCF a podobá se kodéru Text. Hlavní rozdíl spočívá v tom, že optimalizuje velké bloky binárních objektů nebo "Binární velké objekty" (BLOB), a to tak, že je nepřevedí na kódování Base-64 před vložením do bajtů zpráv. Místo toho se tyto objekty BLOB extrahují a odkazují na přílohy MIME.

Psaní vlastního kodéru

Pokud chcete implementovat vlastní kodér zpráv, musíte zadat vlastní implementace následujících abstraktních základních tříd:

Převod ze znázornění zprávy v paměti na reprezentaci, kterou lze zapsat do datového proudu, je zapouzdřena v rámci MessageEncoder třídy, která slouží jako továrna pro čtečky XML a zapisovače XML, které podporují konkrétní typy kódování XML.

Jedná se o kód, který napíšete v těchto metodách, který zpracovává převod mezi standardním transportní protokolem a vlastním kódováním.

Dále potřebujete naprogramovat třídu továrny, která vytvoří vlastní kodér. Encoder Přepište, aby se vrátila instance vlastního MessageEncoderobjektu .

Pak připojte vlastní MessageEncoderFactory sadu elementů vazby, která se používá ke konfiguraci služby nebo klienta přepsáním CreateMessageEncoderFactory metody pro vrácení instance této továrny.

V WCF jsou k dispozici dvě ukázky, které ilustrují tento proces s ukázkovým kódem: Vlastní kodér zpráv: Vlastní kodér textu a vlastní kodér zpráv: Kodér komprese.

Viz také