Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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í instance Message do a z drátové reprezentace. 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 System-Provided
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 kodéry Text, Binary a MTOM 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 XML kodéru textových zpráv se nazývá kodér POX ("Plain Old XML"), aby byl rozlišen od textového kódování SOAP.
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 System-Provided
Kódování je přidáno do vazby pomocí třídy odvozené z MessageEncodingBindingElement.
WCF poskytuje následující typy vazebních prvků odvozených z MessageEncodingBindingElement třídy, které mohou poskytovat kódování textu, binárního a optimalizačního mechanismu pro přenos zpráv (MTOM).
TextMessageEncodingBindingElement: Nejoperabilní, ale nejméně efektivní kodér pro zprávy XML. Klient webové služby nebo samotná webová služba může obecně rozumět textovému XML. Přenos velkých bloků binárních dat jako 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 tím, že je přenáší as-is, bez převodu na text.
Vazební prvek vytvoří binární, MTOM nebo text MessageEncoderFactory. Továrna 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 kodérů jsou metody ReadMessage a WriteMessage. 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 podpůrným obsahem, 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ů System-Provided
Kodéry poskytované systémem poskytují řadu funkcí.
Sdružování
Každá z implementací kodéru se snaží co nejefektivněji sdružovat zdroje. Snížení přidělení je klíčovým způsobem, jak zlepšit výkon spravovaného kódu. K dosažení tohoto sdružování používá třídu SynchronizedPool implementace. Soubor C# obsahuje popis dalších optimalizací používaných touto třídou.
XmlDictionaryReader a XmlDictionaryWriter instance jsou sdružovány a znovu inicializovány, aby se předešlo 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 vlastnostmi MaxReadPoolSize a MaxWritePoolSize v každé ze tří tříd odvozených z MessageEncodingBindingElement.
Binární kódování
Pokud binární kódování používá relace, je nutné předat řetězec dynamického slovníku 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, aby přenos byl uložen do vyrovnávací paměti.
Řetězce jsou k zprávě připojeny interní AddSessionInformationToMessage metodou. Přidá řetězce jako UTF-8 na začátek zprávy s předponou uvádějící jejich délku. Celé záhlaví slovníku je pak předcházeno délkou svých 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.
Pro správnou práci s protokolem HTTP poskytuje třída interního kodéru zpráv MTOM některá interní rozhraní API pro GetContentType (které je také interní) a WriteMessage, které je veřejné a lze je 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é kousky binárních dat, tedy "Binární velké objekty" (BLOB), tím, že je před jejich vložením do bajtů zprávy nepřevede na kódování Base-64. Místo toho jsou tyto BLOBy extrahovány a odkazovány jako 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 z reprezentace zprávy v paměti na reprezentaci, kterou lze zapsat do streamu, je zapouzdřen 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.
Klíčové metody této třídy, které je nutné přepsat, jsou:
WriteMessage který vezme MessageEncodingBindingElement objekt a zapíše ho do objektu Stream .
ReadMessage který přebírá Stream objekt a maximální velikost záhlaví a vrací Message objekt.
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.
Potřebujete naprogramovat tovární třídu, která slouží k vytvoření vlastního kodéru. Přepište Encoder, aby se vrátila instance vašeho vlastního objektu MessageEncoder.
Pak připojte vlastní MessageEncoderFactory ke zásobníku elementů vazby, který se používá ke konfiguraci služby nebo klienta, přepsáním metody CreateMessageEncoderFactory 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.