Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье рассматриваются критерии выбора среди кодировщиков сообщений, включенных в Windows Communication Foundation (WCF): двоичный, текстовый и механизм оптимизации передачи сообщений (MTOM).
В WCF вы указываете, как передавать данные по сети между конечными точками с помощью привязки, состоящей из последовательности элементов привязки. Кодировщик сообщений представлен элементом привязки, который выполняет кодирование сообщений в стеке привязки. Привязка включает необязательные элементы привязки протокола, такие как элемент привязки безопасности или элемент привязки надежного обмена сообщениями, обязательный элемент привязки кодирования сообщений и обязательный элемент привязки транспорта.
Элемент привязки кодирования сообщения располагается ниже необязательных элементов привязки протокола и выше обязательного элемента привязки транспорта. На исходящей стороне кодировщик сообщений сериализует исходящий Message и передает его транспорту. На входящей стороне кодировщик сообщений получает сериализованную форму Message от транспорта и передает её на более высокий уровень протокола, если он присутствует, или в приложение, если нет.
При подключении к уже существующему клиенту или серверу может не потребоваться использовать определенную кодировку сообщений, так как необходимо кодировать сообщения таким образом, чтобы другая сторона ожидала. Однако если вы пишете службу WCF, вы можете предоставлять свою службу через несколько конечных точек, каждый из которых использует разные кодировки сообщений. Это позволяет клиентам выбирать оптимальную кодировку для общения со службой по конечной точке, которая лучше всего подходит для них, а также предоставлять клиентам гибкость в выборе кодировки, которая лучше всего подходит для них. Использование нескольких конечных точек также позволяет объединить преимущества различных кодировок сообщений с другими элементами привязки.
кодировщики System-Provided
WCF включает три кодировщика сообщений, которые представлены следующими тремя классами:
TextMessageEncodingBindingElement, кодировщик текстовых сообщений, поддерживает как кодировку обычного XML, так и кодировку SOAP. Обычный режим кодирования XML кодировщика текстовых сообщений называется "обычный старый XML" (POX), чтобы отличить его от кодировки SOAP на основе текста. Чтобы включить POX, установите свойство MessageVersion в None. Используйте кодировщик текстовых сообщений для взаимодействия с конечными точками, отличными от WCF.
BinaryMessageEncodingBindingElement, кодировщик двоичных сообщений, использует компактный двоичный формат и оптимизирован для обмена данными WCF с WCF и поэтому не совместим. Это также наиболее производительный кодировщик всех кодировщиков WCF.
MtomMessageEncodingBindingElement, элемент привязки, указывает кодировку символов и управление версиями сообщений для сообщений с помощью кодировки MTOM. MTOM — это эффективная технология передачи двоичных данных в сообщениях WCF. Кодировщик MTOM пытается создать баланс между эффективностью и взаимодействием. Кодировка MTOM передает большинство XML в текстовой форме, но оптимизирует большие блоки двоичных данных путем передачи их as-isбез преобразования в текст. С точки зрения эффективности, среди кодеров, которые предоставляет WCF, MTOM занимает промежуточное положение между текстовым (самым медленным) и двоичным (самым быстрым) кодированием.
Выбор кодировщика сообщений
В следующей таблице описываются распространенные факторы, используемые для выбора кодировщика сообщений. Определите приоритеты факторов, важных для приложения, а затем выберите кодировщики сообщений, которые лучше всего работают с этими факторами. Не забудьте учитывать дополнительные факторы, не перечисленные в этой таблице, и любые пользовательские кодировщики сообщений, которые могут потребоваться в приложении.
| Фактор | Описание | Кодировщики, поддерживающие этот фактор |
|---|---|---|
| Поддерживаемые наборы символов | TextMessageEncodingBindingElement и MtomMessageEncodingBindingElement поддерживают только кодировки UTF8 и UTF16 Юникод (big-endian и little-endian). Если требуются другие кодировки, например UTF7 или ASCII, необходимо использовать пользовательский кодировщик. Пример пользовательского кодировщика см. в разделе "Пользовательский кодировщик сообщений". | Текст |
| Инспекция | Проверка — это возможность проверять сообщения во время передачи. Кодировки текста с использованием SOAP или без них позволяют проверять и анализировать сообщения многими приложениями без использования специализированных средств. Использование безопасности передачи на уровне сообщения или транспорта влияет на возможность проверки сообщений. Конфиденциальность защищает сообщение от проверки и целостности защищает сообщение от изменения. | Текст |
| Надежность | Надежность — это устойчивость кодировщика к ошибкам передачи. Надежность также может быть предоставлена на уровне сообщений, транспорта или приложения. Все стандартные кодировщики WCF предполагают, что другой уровень обеспечивает надежность. Кодировщик не может восстановиться после ошибки передачи. | Отсутствует |
| Простота | Простота представляет простоту, с помощью которой можно создавать кодировщики и декодеры для спецификации кодирования. Кодировки текста особенно выгодны для простоты, и кодировка текста POX имеет дополнительное преимущество, не требующее поддержки обработки SOAP. | Текст (POX) |
| Размер | Кодировка определяет объем накладных расходов, наложенных на содержимое. Размер закодированных сообщений напрямую связан с максимальной пропускной способностью операций службы. Двоичные кодировки обычно более компактны, чем текстовые кодировки. Если размер сообщения находится на уровне "Премиум", рекомендуется также сжимать содержимое сообщения во время кодирования. Однако сжатие добавляет затраты на обработку как отправителя сообщения, так и получателя. | Бинарный |
| Стриминг | Потоковая передача позволяет приложениям начать обработку сообщения до прибытия всего сообщения. Эффективное использование потоковой передачи требует, чтобы важные данные для сообщения были доступны в начале сообщения, чтобы принимающее приложение не требовалось ожидать его поступления. Кроме того, приложения, использующие передачу данных по потокам, должны формировать данные в сообщении постепенно так, чтобы содержимое не имело зависимостей вперед. Во многих случаях необходимо идти на компромисс между потоковой передачей данных и обеспечение наименьшего возможного размера передаваемых данных. | Отсутствует |
| Поддержка сторонних инструментов | К областям поддержки кодирования относятся разработка и диагностика. Сторонние разработчики внесли большие инвестиции в библиотеки и наборы средств для обработки сообщений, закодированных в формате POX. | Текст (POX) |
| Совместимость | Этот фактор относится к способности кодировщика WCF взаимодействовать со службами, отличными от WCF. | Текст MTOM (частично) |
Примечание. При использовании двоичного кодировщика использование параметра IgnoreWhitespace при создании XMLReader не будет влиять. Например, если вы выполните следующее внутри операции службы:
public void OperationContract(XElement input)
{
Console.WriteLine("{0}", input.Value);
int counter = 0;
var xreader = input.CreateReader();
var reader = XmlReader.Create(xreader, new XmlReaderSettings() { IgnoreWhitespace = true });
while (reader.Read())
{
counter++;
}
Console.WriteLine("Read {0} lines with reader", counter);
}
Параметр IgnoreWhitespace игнорируется.
Сжатие и двоичный кодировщик
Начиная с WCF 4.5 двоичный кодировщик WCF добавляет поддержку сжатия. Это позволяет использовать алгоритм gzip/deflate для отправки сжатых сообщений от клиента WCF, а также реагирования на сжатые сообщения из локальной службы WCF. Эта функция обеспечивает сжатие как для транспорта HTTP, так и TCP. Служба WCF, размещенная в IIS, всегда может быть включена для отправки сжатых ответов, настроив сервер узла IIS. Тип сжатия настраивается свойством BinaryMessageEncodingBindingElement.CompressionFormat . Это свойство установлено на одно из значений перечисления System.ServiceModel.Channels.CompressionFormat:
Так как это свойство предоставляется только в двоичном файлеMessageEncodingBindingElement, вам потребуется создать пользовательскую привязку, например следующую, чтобы использовать эту функцию:
<customBinding>
<binding name="BinaryCompressionBinding">
<binaryMessageEncoding compressionFormat ="GZip" />
<httpTransport />
</binding>
</customBinding>
Клиент и служба должны согласиться отправлять и получать сжатые сообщения, поэтому свойство compressionFormat должно быть настроено на элемент binaryMessageEncoding как для клиента, так и службы. ProtocolException возникает, если либо служба, либо клиент не настроены на использование сжатия, в то время как другая сторона настроена. Следует тщательно обдумать включение сжатия. Сжатие в первую очередь полезно, если пропускная способность сети является препятствием. В случае, если ЦП является узким местом, сжатие уменьшит пропускную способность. Необходимо выполнить соответствующее тестирование в имитированной среде, чтобы узнать, является ли это преимуществом приложения.