Потоковая передача сообщений
Транспорты Windows Communication Foundation (WCF) поддерживают два режима передачи сообщений:
При буферизованной передаче все сообщение хранится в буфере памяти до завершения передачи. Буферизованное сообщение должно быть доставлено полностью, прежде чем получатель сможет его прочитать.
При потоковой передаче сообщение передается в виде потока. Получатель начинает обработку сообщения до того, как оно будет полностью доставлено.
Потоковая передача позволяет улучшить возможности масштабирования службы за счет исключения необходимости использовать большие буферы памяти. Степень улучшения масштабируемости при изменении режима передачи зависит от размера передаваемых сообщений. Для сообщений большого размера предпочтительнее использовать потоковую передачу.
По умолчанию транспорты HTTP, TCP/IP и именованных каналов используют буферизованную передачу. Этот документ описывает изменение режима передачи с буферизованной на потоковую для этих транспортов, а также возможные последствия.
Включение потоковой передачи
Выбор режима передачи выполняется в элементе привязки транспорта. Свойству TransferMode элемента привязки можно присвоить значение Buffered
, Streamed
, StreamedRequest
или StreamedResponse
. Если режиму передачи присвоено значение Streamed
, потоковая передача будет выполняться в обоих направлениях. Если режиму передачи присвоено значение StreamedRequest
или StreamedResponse
, потоковая передача будет выполняться только в указанном направлении.
Привязки BasicHttpBinding, NetTcpBinding и NetNamedPipeBinding предоставляют свойство TransferMode. Для других транспортов необходимо создать пользовательскую привязку для задания режима передачи.
Решение по использованию буферизованной или потоковой передачи является локальным решением конечной точки. Для транспортов HTTP режим передачи не распространяется через подключение или на серверы и другие посредники. Выбор режима передачи не отражается в описании интерфейса службы. Чтобы задать режим, после создания класса клиента для службы необходимо изменить файл конфигурации для тех служб, которые планируется использовать с потоковой передачей. Для транспортов TCP и именованного канала режим передачи распространяется в виде утверждения политики.
Примеры кода см. в разделе "Практическое руководство. Включение потоковой передачи".
Включение асинхронной потоковой передачи
Чтобы включить асинхронную потоковую передачу, добавьте DispatcherSynchronizationBehavior поведение конечной точки в узел службы и задайте для его свойства true
значениеAsynchronousSendEnabled.
Эта версия WCF также добавляет возможность истинной асинхронной потоковой передачи на стороне отправки. Это повышает масштабируемость службы в сценариях, когда обрабатываются потоковые сообщения для нескольких клиентов. Некоторые из этих сообщений считываются медленно, возможно, из-за перегрузки сети или не считываются совсем. В этих сценариях WCF больше не блокирует поклиентно отдельные потоки службы. Это гарантирует, что служба может обрабатывать гораздо больше клиентов, повышая таким образом масштабируемость службы.
Ограничения потоковой передачи
При использовании режима потоковой передачи среда выполнения накладывает дополнительные ограничения.
Операции, происходящие в потоковом транспорте, могут иметь контракт не более чем с одним входным или выходным параметром. Такой параметр соответствует всему телу сообщения и должен принадлежать к типу Message, наследуемому от Stream, или реализации IXmlSerializable. Наличие возвращаемого значения операции эквивалентно наличию выходного параметра.
Некоторые функции WCF, такие как надежная передача сообщений, транзакции и безопасность на уровне сообщений SOAP, полагаются на буферизацию сообщений для передачи. Использование этих возможностей может уменьшить или свести до минимума повышение производительности, достигаемое за счет потоковой передачи. Для защиты потокового транспорта следует использовать либо безопасность только на транспортном уровне, либо безопасность на транспортном уровне и безопасность сообщений только с проверкой подлинности.
Заголовки SOAP буферизуются всегда, даже если выбран режим потоковой передачи. Размер заголовков сообщений не должен превышать размер квоты транспорта MaxBufferSize
. Дополнительные сведения об этом параметре см. в разделе "Квоты транспорта".
Различия между буферизованной и потоковой передачей
Изменение режима передачи с буферизованного на потоковый также приводит к изменению собственной формы канала для транспортов TCP и именованных каналов. При буферизованной передаче собственная форма канала представлена интерфейсом IDuplexSessionChannel. При потоковой передаче собственные каналы представлены интерфейсами IRequestChannel и IReplyChannel. Изменение режима передачи в существующем приложении, использующем эти транспорты напрямую (т.е. не через контракт службы), требует изменения ожидаемой формы канала для производств и прослушивателей каналов.