Выбор кодировщика сообщенийChoose a Message Encoder

В этой статье рассматриваются критерии выбора из кодировщиков сообщений, включенных в Windows Communication Foundation (WCF): двоичный, текстовый и механизм оптимизации передачи сообщений (MTOM).This article discusses criteria for choosing among the message encoders that are included in Windows Communication Foundation (WCF): binary, text, and Message Transmission Optimization Mechanism (MTOM).

В WCF вы указываете, как передавать данные по сети между конечными точками с помощью привязки, которая состоит из последовательности элементов привязки.In WCF, you specify how to transfer data across a network between endpoints by means of a binding, which is made up of a sequence of binding elements. Кодировщик сообщений - это элемент привязки кодирования сообщений в стеке привязки.A message encoder is represented by a message encoding binding element in the binding stack. В привязку входят необязательные элементы привязки протокола, такие как элемент привязки безопасности или элемент привязки надежного обмена сообщениями, обязательный элемент привязки кодирования сообщений, и обязательный элемент привязки транспорта.A binding includes optional protocol binding elements, such as a security binding element or reliable messaging binding element, a required message encoding binding element, and a required transport binding element.

Элемент привязки кодирования сообщений находится под необязательными элементами привязки протокола и над обязательным элементом привязки транспорта.The message encoding binding element sits below the optional protocol binding elements and above the required transport binding element. На стороне отправки кодировщик сообщений сериализует исходящий объект Message и передает его транспорту.On the outgoing side, a message encoder serializes the outgoing Message and passes it to the transport. На стороне приема кодировщик сообщений получает сериализованную форму объекта Message от транспорта и передает его на более высокий уровень протоколов, если он имеется, или приложению в противном случае.On the incoming side, a message encoder receives the serialized form of a Message from the transport and passes it to the higher protocol layer, if present, or to the application, if not.

При соединении с существующим клиентом или сервером возможно, что выбирать кодировщик не придется: кодировать сообщения необходимо способом, которого ожидает другая сторона.When connecting to a pre-existing client or server, you may not have a choice about using a particular message encoding since you need to encode your messages in a way that the other side is expecting. Однако при написании службы WCF вы можете предоставить службу через несколько конечных точек, каждая из которых использует другую кодировку сообщений.However, if you are writing a WCF service, you can expose your service through multiple endpoints, each using a different message encoding. Это позволяет клиентам выбирать оптимальный способ кодирования для взаимодействия со службой через оптимальную для них конечную точку, т. е. клиентам предоставляется возможность выбирать способ кодирования, лучше всего им подходящий.This allows clients to choose the best encoding for talking to your service over the endpoint that is best for them, as well as giving your clients the flexibility to choose the encoding that is best for them. Использование нескольких конечных точек также позволяет сочетать преимущества разных способов кодирования сообщений с другими элементами привязки.Using multiple endpoints also allows you to combine the advantages of different message encodings with other binding elements.

Кодировщики, предоставляемые системойSystem-Provided Encoders

WCF включает три кодировщика сообщений, которые представлены следующими тремя классами:WCF includes three message encoders, which are represented by the following three classes:

  • TextMessageEncodingBindingElement - текстовый кодировщик сообщений - поддерживает и кодирование в простой XML, и кодирование SOAP.TextMessageEncodingBindingElement, the text message encoder, supports both plain XML encoding and SOAP encoding. Режим кодирования в простой XML текстового кодировщика называется "plain old XML" (POX), что позволяет отличить его от текстового кодирования SOAP.The plain XML encoding mode of the text message encoder is called "plain old XML" (POX) to distinguish it from text-based SOAP encoding. Чтобы включить POX, присвойте свойству MessageVersion значение None.To enable POX, set the MessageVersion property to None. Используйте кодировщик текстовых сообщений для взаимодействия с конечными точками, отличными от WCF.Use the text message encoder to interoperate with non-WCF endpoints.

  • BinaryMessageEncodingBindingElement, кодировщик двоичных сообщений использует компактный двоичный формат и оптимизирован для взаимодействия WCF с WCF и, следовательно, не поддерживает взаимодействие.BinaryMessageEncodingBindingElement, the binary message encoder, uses a compact binary format and is optimized for WCF to WCF communication, and hence is not interoperable. Это также самый производительный кодировщик всех кодировщиков, предоставляемых WCF.This is also the most performant encoder of all the encoders WCF provides.

  • MtomMessageEncodingBindingElement - элемент привязки - задает способ кодирования и управления версиями для сообщений, использующих кодирование MTOM.MtomMessageEncodingBindingElement, the binding element, specifies the character encoding and message versioning for messages using MTOM encoding. MTOM - это эффективный способ передачи двоичных данных в сообщениях WCF.MTOM is an efficient technology for transmitting binary data in WCF messages. Кодировщик MTOM пытается сохранить баланс между эффективностью и совместимостью.The MTOM encoder attempts to create a balance between efficiency and interoperability. Кодирование MTOM передает большую часть XML-данных в текстовой форме, но оптимизирует большие блоки двоичных данных путем передачи их в исходном виде, без преобразования в текст.The MTOM encoding transmits most XML in textual form, but optimizes large blocks of binary data by transmitting them as-is, without conversion to text. С точки зрения эффективности, среди кодировщиков, предоставляемых WCF, функция MTOM находится между текстом (самая медленная) и двоичной (самая быстрая).In terms of efficiency, among the encoders WCF provides, MTOM is in-between text (the slowest) and binary (the fastest).

Выбор кодировщика сообщенийHow to Choose a Message Encoder

В следующей таблице приведены факторы, чаще всего влияющие на выбор кодировщика сообщений.The following table describes common factors used to choose a message encoder. Расположите эти факторы в соответствии с их приоритетом для данного приложения и выберите оптимальные кодировщики сообщений.Prioritize the factors that are important for your application, and then choose the message encoders that work best with these factors. Не забудьте принять во внимание все дополнительные факторы, не приведенные в этой таблице, а также пользовательские кодировщики сообщений, которые могут понадобиться в приложении.Be sure to consider any additional factors not listed in this table and any custom message encoders that may be required in your application.

ФакторFactor ОписаниеDescription Кодировщики, поддерживающие этот факторEncoders that support this factor
Поддерживаемые кодировкиSupported Character Sets TextMessageEncodingBindingElement и MtomMessageEncodingBindingElement поддерживают только кодировки UTF8 и UTF16 Unicode (с обратным порядком байтов и с прямым порядком байтов).TextMessageEncodingBindingElement and MtomMessageEncodingBindingElement support only the UTF8 and UTF16 Unicode (big-endian and little-endian) encodings. Если требуются другие кодировки, такие как UTF7 или ASCII, необходимо использовать пользовательский кодировщик.If other encodings are required, such as UTF7 or ASCII, a custom encoder must be used. Пример пользовательского кодировщика см. в разделе пользовательский кодировщик сообщений.For a sample custom encoder, see Custom Message Encoder. ТекстText
ПроверкаInspection Под проверкой понимается возможность анализа сообщений во время передачи.Inspection is the ability to examine messages during transmission. Текстовое кодирование (как с использованием SOAP, так и без) позволяет ряду приложений проверять и анализировать сообщения без использования специализированных инструментов.Text encodings, either with or without the use of SOAP, allow messages to be inspected and analyzed by many applications without the use of specialized tools. Использование защиты передачи данных на уровне сообщения или транспорта влияет на возможность проверки сообщений.The use of transfer security, at either the message or transport level, affects your ability to inspect messages. Конфиденциальность подразумевает защиту сообщения от анализа, а целостность - от изменения.Confidentiality protects a message from being examined and integrity protects a message from being modified. ТекстText
НадежностьReliability Надежность - это устойчивость кодировщика к ошибкам передачи.Reliability is the resiliency of an encoder to transmission errors. Надежность также может обеспечиваться на уровне сообщения, транспорта или приложения.Reliability can also be provided at the message, transport, or application layer. Все стандартные кодировщики WCF предполагают, что другой уровень обеспечивает надежность.All of the standard WCF encoders assume that another layer is providing reliability. Способность кодировщика восстановиться после ошибки передачи весьма ограничена.The encoder has little ability to recover from a transmission error. NoneNone
ПростотаSimplicity Под простотой понимается простота создания кодировщиков и декодеров по спецификации кодирования.Simplicity represents the ease with which you can create encoders and decoders for an encoding specification. В этом отношении особо предпочтительны текстовые способы кодирования, причем текстовое кодирование POX имеет дополнительное преимущество - не требует поддержки обработки SOAP.Text encodings are particularly advantageous for simplicity, and the POX text encoding has the additional advantage of not requiring support for processing SOAP. Текстовый (POX)Text (POX)
РазмерSize Способ кодирования определяет объем служебных данных, налагаемых на содержимое.The encoding determines the amount of overhead imposed on content. Размер кодированных сообщений напрямую связан с максимальной пропускной способностью операций службы.The size of encoded messages is directly related to the maximum throughput of service operations. Двоичные способы обычно обеспечивают более компактное кодирование, чем текстовые.Binary encodings are generally more compact than text encodings. Когда размер сообщений имеет большое значение, следует рассмотреть также сжатие содержимого сообщений при кодировании.When message size is at a premium, consider also compressing the message contents during encoding. При этом следует помнить, что сжатие увеличивает вычислительные затраты как на стороне отправки, так и на стороне приема сообщений.However, compression adds processing costs for both the message sender and receiver. Двоичные данныеBinary
Потоковая передачаStreaming Потоковая передача позволяет приложениям начинать обработку сообщения до получения всего сообщения.Streaming allows applications to begin processing a message before the entire message has arrived. Эффективное использование потоковой передачи требует, чтобы важные данные содержались в начале сообщения, т. е. получающему приложению не нужно было дожидаться их поступления.Effectively using streaming requires that the important data for a message be available at the beginning of the message so that the receiving application is not required to wait for it to arrive. Кроме того, приложения, использующие потоковую передачу, должны организовывать данные в сообщениях инкрементно, чтобы в содержимом не было зависимостей от последующих данных.Moreover, applications that use streamed transfer must organize data in the message incrementally so that the content does not have forward dependencies. Во многих случаях приходится идти на компромисс между потоковой передачей сообщения и минимальным размером передачи для содержимого.In many cases, you must compromise between streaming content and having the smallest possible transfer size for that content. NoneNone
Поддержка сторонних средствThird-Party Tool Support Возможная поддержка включает разработку и диагностику.Support areas for an encoding include development and diagnosis. Сторонние разработчики делают большие вложения в библиотеки и наборы инструментов для обработки сообщений, кодированных в формат POX.Third-party developers have made a large investment in libraries and toolkits for handling messages encoded in the POX format. Текстовый (POX)Text (POX)
СовместимостьInteroperability Этот фактор относится к способности кодировщика WCF взаимодействовать со службами, отличными от WCF.This factor refers to the ability of a WCF encoder to interoperate with non-WCF services. ТекстText

MTOM (частично)MTOM (partial)

Примечание. При использовании двоичного кодировщика использование параметра IgnoreWhitespace при создании XmlReader не оказывает никакого влияния.Note: When using the Binary Encoder, using the IgnoreWhitespace setting when creating a XMLReader will have no effect. Например, если в операции службы выполняются следующие действия.For example, if you do the following inside a service operation:

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 не учитывается.The IgnoreWhitespace setting is ignored.

Сжатие и двоичный кодировщикCompression and the Binary Encoder

Начиная с версии WCF 4.5, в двоичном кодировщике появилась поддержка сжатия.Beginning with WCF 4.5 the WCF binary encoder adds support for compression. Это позволяет использовать алгоритм gzip/deflate для передачи сжатых сообщений из WCF-клиента и отправлять сжатые сообщения из резидентной службы WCF.This enables you to use the gzip/deflate algorithm for sending compressed messages from a WCF client and also respond with compressed messages from a self-hosted WCF service. Эта возможность обеспечивает сжатие сообщения для HTTP и TCP-каналов.This feature enables compression on both the HTTP and TCP transports. WCF-службу, размещенную в IIS, можно настроить на повсеместную отправку сжатых ответов, выполнив соответствующую настройку узла IIS.An IIS hosted WCF service can always be enabled for sending compressed responses by configuring the IIS host server. Тип сжатия задается с помощью свойства BinaryMessageEncodingBindingElement.CompressionFormat.The type of compression is configured with the BinaryMessageEncodingBindingElement.CompressionFormat property. Свойству присваивается одно из значений перечисления System.ServiceModel.Channels.CompressionFormat.This property is set to one of the System.ServiceModel.Channels.CompressionFormat enum values:

Так как это свойство доступно только в Бинаримессажеенкодингбиндинжелемент, для использования этой функции необходимо создать пользовательскую привязку, подобную приведенной ниже:Since this property is only exposed on the binaryMessageEncodingBindingElement, you will need to create a custom binding like the following to use this feature:

<customBinding>
  <binding name="BinaryCompressionBinding">
    <binaryMessageEncoding compressionFormat ="GZip" />
    <httpTransport />
 </binding>
</customBinding>

Как клиенту, так и службе необходимо согласовать отправку и получение сжатых сообщений, поэтому свойство Компрессионформат должно быть настроено в элементе Бинаримессажеенкодинг как на стороне клиента, так и в службе.Both the client and the service need to agree to send and receive compressed messages and therefore the compressionFormat property must be configured on the binaryMessageEncoding element on both client and service. Если служба или клиент не настроены для сжатия, создается исключение ProtocolException, а другая сторона —.A ProtocolException is thrown if either the service or client is not configured for compression, but the other side is. Следует тщательно учитывать включение сжатия.Enabling compression should be carefully considered. Сжатие наиболее полезно в том случае, когда пропускная способность канала является узким местом в системе.Compression is mostly useful if network bandwidth is a bottleneck. В тех случаях, когда узким местом для производительности является ЦП, сжатие снизит пропускную способность системы.In the case where the CPU is the bottleneck, compression will decrease throughput. Для определения полезности применения сжатия для работы системе следует выполнить соответствующие тесты в симулированной среде выполнения.Appropriate testing must be done in a simulated environment to find out if this benefits the application

См. такжеSee also