Выбор кодировщика сообщений
В этом разделе рассматриваются критерии выбора способа кодирования сообщений (кодировщика) из предусмотренных в Windows Communication Foundation (WCF) двоичного, текстового и механизма оптимизации передачи сообщений (MTOM).
В WCF способ передачи данных по сети между конечными точками задается посредством привязки, которая состоит из последовательности элементов привязки. Кодировщик сообщений — это элемент привязки кодирования сообщений в стеке привязки. В привязку входят необязательные элементы привязки протокола, такие как элемент привязки безопасности или элемент привязки надежного обмена сообщениями, обязательный элемент привязки кодирования сообщений, и обязательный элемент привязки транспорта.
Элемент привязки кодирования сообщений находится под необязательными элементами привязки протокола и над обязательным элементом привязки транспорта. На стороне отправки кодировщик сообщений сериализует исходящий объект Message и передает его транспорту. На стороне приема кодировщик сообщений получает сериализованную форму объекта Message от транспорта и передает его на более высокий уровень протоколов, если он имеется, или приложению в противном случае.
При соединении с существующим клиентом или сервером возможно, что выбирать кодировщик не придется: кодировать сообщения необходимо способом, которого ожидает другая сторона. Тем не менее, при написании службы WCF можно предоставить службу посредством нескольких конечных точек, использующих разные способы кодирования сообщений. Это позволяет клиентам выбирать оптимальный способ кодирования для взаимодействия со службой через оптимальную для них конечную точку, т. е. клиентам предоставляется возможность выбирать способ кодирования, лучше всего им подходящий. Использование нескольких конечных точек также позволяет сочетать преимущества разных способов кодирования сообщений с другими элементами привязки.
Кодировщики, предоставляемые системой
В WCF предусмотрено три кодировщика сообщений, которые представлены следующими тремя классами.
TextMessageEncodingBindingElement — текстовый кодировщик сообщений — поддерживает и кодирование в простой XML, и кодирование SOAP. Режим кодирования в простой XML текстового кодировщика называется "plain old XML" (POX), что позволяет отличить его от текстового кодирования SOAP. Чтобы включить POX, присвойте свойству MessageVersion значение None. Текстовый кодировщик сообщений следует использовать для взаимодействия с конечными точками, не являющимися конечными точками WCF.
BinaryMessageEncodingBindingElement — двоичный кодировщик сообщений — кодирует сообщения в компактный двоичный формат. Он оптимизирован для обмена данными "WCF-WCF", поэтому не поддерживает взаимодействие. Он также является наиболее производительным из всех предоставляемых WCF кодировщиков.
MTOMMessageEncodingBindingElement — элемент привязки — задает способ кодирования и управления версиями для сообщений, использующих кодирование MTOM. MTOM — это эффективная технология передачи двоичных данных в сообщениях WCF. Кодировщик MTOM пытается сохранить баланс между эффективностью и совместимостью. При кодировании MTOM большая часть XML-данных передается в текстовой форме; передача больших блоков двоичных данных оптимизируется путем их передачи в исходном виде, без преобразования в текст. С точки зрения эффективности из всех кодировщиков WCF MTOM находится между текстовым (самым медленным) и двоичным (самым быстрым).
Выбор кодировщика сообщений
В следующей таблице приведены факторы, чаще всего влияющие на выбор кодировщика сообщений. Расположите эти факторы в соответствии с их приоритетом для данного приложения и выберите оптимальные кодировщики сообщений. Не забудьте принять во внимание все дополнительные факторы, не приведенные в этой таблице, а также пользовательские кодировщики сообщений, которые могут понадобиться в приложении.
Фактор | Описание | Кодировщики, поддерживающие этот фактор |
---|---|---|
Поддерживаемые кодировки |
TextMessageEncodingBindingElement и MtomMessageEncodingBindingElement поддерживают только кодировки Юникод UTF8 и UTF16 (обратный порядок байтов и прямой порядок байтов). Если требуются другие кодировки, такие как UTF7 или ASCII, необходимо использовать пользовательский кодировщик. Образец пользовательского кодировщика см. в разделе Пользовательский кодировщик сообщений. |
Текстовый |
Проверка |
Под проверкой понимается возможность анализа сообщений во время передачи. Текстовое кодирование (как с использованием SOAP, так и без) позволяет ряду приложений проверять и анализировать сообщения без использования специализированных инструментов. Обратите внимание, что возможность проверки сообщений зависит от использования механизма безопасности транспорта (на уровне сообщения или на уровне транспорта). Конфиденциальность подразумевает защиту сообщения от анализа, а целостность — от изменения. |
Текстовый |
Надежность |
Надежность — это устойчивость кодировщика к ошибкам передачи. Надежность также может обеспечиваться на уровне сообщения, транспорта или приложения. Все стандартные кодировщики WCF предполагают, что надежность обеспечивается на другом уровне. Способность кодировщика восстановиться после ошибки передачи весьма ограничена. |
Нет |
Простота |
Под простотой понимается простота создания кодировщиков и декодеров по спецификации кодирования. В этом отношении особо предпочтительны текстовые способы кодирования, причем текстовое кодирование POX имеет дополнительное преимущество — не требует поддержки обработки SOAP. |
Текстовый (POX) |
Размер |
Способ кодирования определяет объем служебных данных, налагаемых на содержимое. Размер кодированных сообщений напрямую связан с максимальной пропускной способностью операций службы. Двоичные способы обычно обеспечивают более компактное кодирование, чем текстовые. Когда размер сообщений имеет большое значение, следует рассмотреть также сжатие содержимого сообщений при кодировании. При этом следует помнить, что сжатие увеличивает вычислительные затраты как на стороне отправки, так и на стороне приема сообщений. |
Двоичный |
Потоковая передача |
Потоковая передача позволяет приложениям начинать обработку сообщения до получения всего сообщения. Эффективное использование потоковой передачи требует, чтобы важные данные содержались в начале сообщения, т. е. получающему приложению не нужно было дожидаться их поступления. Кроме того, приложения, использующие потоковую передачу, должны организовывать данные в сообщениях инкрементно, чтобы в содержимом не было зависимостей от последующих данных. Во многих случаях приходится идти на компромисс между потоковой передачей сообщения и минимальным размером передачи для содержимого. |
Нет |
Поддержка сторонних инструментов |
Возможная поддержка включает разработку и диагностику. Сторонние разработчики делают большие вложения в библиотеки и наборы инструментов для обработки сообщений, кодированных в формат POX. |
Текстовый (POX) |
Взаимодействие |
Под этим фактором понимается способность кодировщика WCF взаимодействовать со службами, не являющимися службами WCF. |
Текстовый MTOM (частично) |