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