Основни въпроси
Windows Communication Foundation (WCF) е базирана на XML комуникационна инфраструктура. Тъй като XML данните често се кодират в стандартния текстов формат, дефиниран в спецификацията XML 1.0, свързаните разработчици на системи и системни архитекти са склонни да обръщат много внимание на разстоянието за предаване (или размера) на съобщенията, изпратени по мрежата, а базираното на текст XML кодиране поставя специални предизвикателства за ефективното предаване на двоични данни.
Основни въпроси
Като част от предоставянето на предистория на следната информация за WCF, този раздел подчертава някои общи съображения за кодиране, двоично и поточно предаване, които обикновено се прилагат към свързани системни инфраструктури.
Кодиране на данни: Текст срещу двоичен код
Често срещаните притеснения на разработчиците включват разбирането, че XML има значително натоварване в сравнение с двоичните формати поради повтарящия се характер на началните и крайните тагове, а кодирането на числови стойности изисква значително повече ресурси, тъй като те се изразяват като текстови стойности и не е възможно ефективно да се изразят двоични данни, тъй като те изискват специално кодиране, което да бъде вградено в текстов формат.
Въпреки че много от тези и подобни въпроси са валидни, действителната разлика между XML текстово кодирани съобщения в среда на XML уеб услуги и двоично кодирани съобщения в предишна среда за извикване на отдалечена процедура (RPC) често е много по-малко значима, отколкото се смяташе първоначално.
Докато XML текстово кодираните съобщения са прозрачни и четими за хора, двоичните съобщения често са неясни в сравнение и трудни за декодиране.без специални средства. Тази разлика в четливостта води до игнориране на факта, че двоичните съобщения често съдържат вградени метаданни в полезния товар, което води до излишък като XML текстовите съобщения. Това е особено вярно за двоични формати, насочени към осигуряване на слаба връзка и възможности за динамично повикване.
Въпреки това, за някои типове данни, като например числа, използването на двоични цифрови представяния с фиксиран размер (например 128-битов десетичен тип вместо обикновен текст) може да бъде неефективно, тъй като текстовото представяне може да бъде с няколко байта по-малко. Текстовите данни също могат да се възползват от предимствата на размера поради обикновено по-гъвкавите опции за кодиране на XML текст, докато някои двоични формати могат да използват по подразбиране 16-битово или дори 32-битово Unicode кодиране, което е неподходящо за двоичния XML формат на данни .NET.
В резултат на това изборът между текстов и двоичен формат не е толкова прост, колкото би бил, ако се вземе предвид фактът, че двоичните съобщения винаги са по-малки от XML текстовите съобщения.
Явно предимство на XML текстовите съобщения е, че те са базирани на стандарти и осигуряват по-голяма оперативна съвместимост и поддръжка на платформа. За повече информация вижте раздела в раздела Кодиране по-късно в тази тема.
Двоично съдържание
В Base64-кодиран низ всеки знак представлява 6-битови данни вместо оригиналните 8-битови данни, което води до съотношение Base64 кодиране към зареждане от 4:3, без да се броят допълнителните знаци за форматиране (връщане на каретка/подаване на ред), които обикновено се добавят.Въпреки че значимостта на разликите между XML кодирането и двоичното кодиране обикновено зависи от сценария, увеличение на размера с повече от 33% за 500 MB полезен товар като цяло е неприемливо.
За да се избегне това прекомерно натоварване на кодирането, стандартът Message Transfer Optimization Subsystem (MTOM) позволява големи елементи от данни, съдържащи се в съобщение, да бъдат външно изразени и предадени със съобщението като двоични данни без никакво специално кодиране. Когато използвате MTOM, съобщенията са подобни на имейл съобщения с прикачени файлове или вградено съдържание (изображения и друго вградено съдържание) през SMTP. MTOM съобщенията са пакетирани като многоелементни/свързани MIME последователности, като основната част е действителното SOAP съобщение.
Съобщението MTOM SOAP е модифицирано от некодираната версия, така че специални етикети на елементи, свързани със съответните MIME части, заемат мястото на оригиналните елементи в съобщението, съдържащо двоичните данни. В резултат на това SOAP съобщението се отнася до двоично съдържание, сочейки към MIME частите, изпратени с него, но предава само XML текстови данни. Тъй като този модел е тясно свързан с надеждния SMTP модел, има широко разпространена поддръжка под формата на инструменти за кодиране и декодиране на MTOM съобщения на много платформи, осигурявайки изключителна оперативна съвместимост.
Въпреки това, както при Base64, MTOM също има някои MIME допълнителни разходи, така че предимствата от използването на MTOM влизат в действие само когато двоичният елемент от данни е по-голям от 1 KB. Поради претоварване съобщенията, кодирани с MTOM, може да имат повече съобщения, кодирани с Base64за двоични данни, ако двоичният полезен товар остане в този диапазон. За повече информация вижте раздела в раздела Кодиране по-късно в тази тема.
Групово съдържание на данни
Като оставим настрана разстоянието за прехвърляне, споменатият по-рано 500MB полезен товар също представлява голям проблем на място на ниво услуга и клиент. По подразбиране WCF обработва съобщенията в буфериран режим. Това означава, че цялото съдържание на съобщението е в паметта преди да бъде изпратено или след като бъде получено. Въпреки че това е добра стратегия за повечето сценарии и е необходима за функции за съобщения като цифрови подписи и надеждна доставка, големите съобщения могат да изтощят системните ресурси.
Поточното предаване е стратегия за обработка на големи полезни товари. Въпреки че съобщенията, особено тези, изразени в XML, обикновено се считат за относително компактни пакети от данни, едно съобщение може да бъде с размер няколко гигабайта и да прилича на непрекъснат поток от данни, а не на пакет от данни. Когато данните се предават поточно, вместо да се буферират, изпращачът излага съдържанието на тялото на съобщението на получателя като поток и инфраструктурата на съобщенията непрекъснато предава поточно данните от подателя към получателя, когато пристигнат.
Най-често срещаният сценарий, при който се прехвърля съдържание на данни с такъв голям обем, е прехвърлянето на двоични обекти с данни, които:
-
не може лесно да се раздели на поредица от съобщения;
трябва да бъдат доставени своевременно;
са напълно недостъпни в началото на предаването.
Данните, които не отговарят на тези ограничения, обикновено се изпращат най-добре като поредица от съобщения в рамките на една сесия,не едно голямо съобщение. За повече информация вижте раздела „Поточно предаване на данни“ по-късно в тази тема.
Кодиране
Кодирането определя набор от правила, свързани с това как съобщенията се представят в мрежата. Кодерът прилага това кодиране и от страна на изпращача извършва трансформирането на съобщението в паметта за съобщения в поток от байтове или буфер от байтове, които могат да бъдат предавани по мрежата. От страната на получателя енкодерът преобразува последователността от байтове в съобщение в паметта.
WCF съдържа три енкодера и ви позволява да създавате и свързвате свои собствени енкодери, ако е необходимо.
Всяко стандартно обвързване включва предварително конфигуриран енкодер, при което обвързванията с префикс Net* използват двоичния енкодер (чрез включване на класа BinaryMessageEncodingBindingElement), докато класовете BasicHttpBinding и WSHttpBinding използват енкодера на текстови съобщения (чрез класа TextMessageEncodingBindingElement) по подразбиране.
TextMessageEncodingBindingElement
Кодерът на текстови съобщения е кодерът по подразбиране за всички базирани на HTTP обвързвания и е правилният избор за всички персонализирани обвързвания, където взаимодействието има най-голямо значение. Този енкодер чете и записва стандартни текстови съобщения SOAP 1.1/SOAP 1.2 без специална обработка на двоични данни. Ако MessageVersion на съобщението е зададено наNone, обвивката на SOAP плика се пропуска от изхода и само съдържанието на тялото на съобщението се сериализира.
Кодерът за съобщения MTOM е текстов енкодер, който прилага специална обработка за двоични данни и не се използва по подразбиране в нито едно от стандартните обвързвания, тъй катое само индивидуална програма за оптимизация. Ако съобщението съдържа двоични данни, които надвишават ограничението, при което MTOM кодирането има предимство, данните се извеждат външно към MIME частта след плика на съобщението. Вижте "Внедряване на MTOM" по-късно в този раздел.
BinaryMessageEncodingBindingElement
Кодерът за двоични съобщения е кодерът по подразбиране за Net* свързвания и е правилният избор, ако и двете комуникиращи страни са базирани на WCF. Кодерът за двоични съобщения използва .NET Binary XML Data Format, двоичното представяне на Microsoft за XML Infosets, което има по-малък отпечатък от еквивалентното XML 1.0 представяне и кодира двоичните данни като поток от байтове.
Базираното на текст кодиране на съобщения обикновено е идеалният избор за всеки път на предаване, който изисква взаимодействие, докато кодирането на двоично съобщение е отлично за всеки друг път на предаване. Двоичното кодиране обикновено води до по-малки съобщения от текста за едно съобщение и в хода на комуникационна сесия размерите на съобщенията неизменно стават още по-малки. За разлика от текстовото кодиране, двоичното не изисква специално боравене с двоични данни, като например използване на Base64, и представя байтовете като байтове.
Ако вашето решение не използва взаимодействие, но все пак трябва да използва HTTP транспорта, можете да създадетеBinaryMessageEncodingBindingElement в персонализирано обвързване, което използва класа HttpTransportBindingElement за транспорта. Ако няколко клиенти на услуги трябва да могат да комуникират, препоръчваме ви да отворите паралелни крайни точки.точки, така че всеки от тях да има правилния транспорт и опции за кодиране за съответните си клиенти.
Внедряване на MTOM
Ако се изисква оперативна съвместимост и трябва да се изпратят големи количества двоични данни, алтернативна стратегия е да се използва кодиране на MTOM съобщения, която може да бъде приложена за стандартнотоbasichttpBinding илиwshttpbinding обвързвания чрез задаване ing. Следният пример на код, взет от примера за кодиране на MTOM, показва как да внедрите MTOM в конфигурация.