Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Потокоориентированные транспорты, такие как TCP и именованные каналы, работают в непрерывном потоке байтов между клиентом и сервером. Этот поток реализуется Stream объектом. При обновлении потока клиент хочет добавить опциональный уровень протокола в стек каналов и просит другой конец канала связи сделать это. Обновление потока состоит в замене исходного Stream объекта обновленным.
Например, можно создать поток сжатия непосредственно на вершине транспортного потока. В этом случае исходный транспорт Stream заменяется на тот, который оборачивает сжатие Stream вокруг исходного.
Вы можете применять несколько обновлений потока, каждое из которых оборачивает предыдущее.
Как работают обновления потоковой передачи
Существует четыре компонента процесса обновления потока данных.
Инициатор потока обновления начинает процесс: в режиме выполнения он может инициировать запрос к другому концу соединения для обновления транспортного уровня канала.
Принимающий поток обновления выполняет обновление: во время выполнения он получает запрос на обновление от другого компьютера, и, если это возможно, принимает обновление.
Поставщик обновления создает Инициатора на клиенте и Акцептор на сервере.
Элемент привязки обновления потока добавляется в привязки службы и клиента и создает поставщика во время выполнения.
Обратите внимание, что в случае нескольких обновлений инициатор и акцептор инкапсулируют автоматы состояний, чтобы заставить соблюдение того, какие переходы обновлений допустимы для каждой инициации.
Как реализовать обновление потока
Windows Communication Foundation (WCF) предоставляет четыре abstract класса, которые можно реализовать:
Чтобы реализовать пользовательское обновление потока, выполните указанные ниже действия. Эта процедура реализует минимальный процесс обновления потока на клиентских и серверных компьютерах.
Создайте класс, который реализует интерфейс StreamUpgradeInitiator.
Переопределите метод InitiateUpgrade, чтобы принять поток для обновления и вернуть обновленный поток. Этот метод работает синхронно; Существуют аналогичные методы для асинхронного запуска обновления.
Переопределите GetNextUpgrade метод, чтобы проверить наличие дополнительных обновлений.
Создайте класс, который реализует интерфейс StreamUpgradeAcceptor.
Переопределите метод AcceptUpgrade, чтобы принять поток для обновления и вернуть обновленный поток. Этот метод работает синхронно; Существуют аналогичные методы для асинхронного принятия обновления.
Переопределите CanUpgrade метод, чтобы определить, поддерживается ли запрос на обновление этим приемчиком обновления на этом этапе процесса обновления.
Создайте класс, который реализует StreamUpgradeProvider. Переопределите методы CreateUpgradeAcceptor и CreateUpgradeInitiator, чтобы возвращать экземпляры приемника и инициатора, определенные в шагах 2 и 1.
Создайте класс, который реализует интерфейс StreamUpgradeBindingElement.
Переопределите BuildClientStreamUpgradeProvider метод на клиенте и BuildServerStreamUpgradeProvider методе службы.
Переопределите метод BuildChannelFactory на клиенте и метод BuildChannelListener на службе, чтобы добавить элемент привязки для обновления в BindingParameters.
Добавьте новый элемент привязки обновления потока к привязкам на сервере и клиентских компьютерах.
Обновления системы безопасности
Добавление обновления системы безопасности — это специализированная версия общего процесса обновления канала.
WCF уже предоставляет два элемента связывания для усиления безопасности потока. Конфигурация безопасности на уровне транспорта инкапсулируется WindowsStreamSecurityBindingElement и SslStreamSecurityBindingElement, которые могут быть настроены и добавлены в настраиваемую привязку. Эти элементы привязки расширяют класс StreamUpgradeBindingElement, создающий поставщиков обновления потока для клиента и сервера. Эти элементы привязки имеют методы, которые создают специализированные классы поставщиков обновления потока безопасности, которые не являются public, так что для этих двух случаев необходимо просто добавить элемент привязки в привязку.
Для сценариев безопасности, не соответствующих приведенным выше двум элементам привязки, три класса, связанные abstract с безопасностью, являются производными от указанного выше инициатора, приемчика и базового класса поставщика:
Процесс реализации обновления потока данных безопасности такой же, как и раньше, с той разницей, что вы используете производные от этих трех классов. Переопределите дополнительные свойства в этих классах, чтобы предоставить сведения о безопасности в среду выполнения.
Несколько обновлений
Чтобы создать дополнительные запросы на обновление, повторите приведенный выше процесс: создайте дополнительные расширения и элементы привязки StreamUpgradeProvider . Добавьте элементы привязки в связывание. Дополнительные элементы привязки обрабатываются последовательно, начиная с первого элемента привязки, добавленного в привязку. В BuildChannelFactory и BuildChannelListener каждый поставщик обновлений может определить, как накладываться на любые существующие параметры привязки обновления. Затем он должен заменить существующий параметр обновления привязки новым составным параметром обновления привязки.
Кроме того, один поставщик обновлений может поддерживать несколько обновлений. Например, может потребоваться реализовать настраиваемый поставщик обновления потока, поддерживающий как безопасность, так и сжатие. Выполните следующие действия:
Подкласс StreamSecurityUpgradeProvider для записи класса поставщика, создающего инициатора и приемчика.
Создайте подкласс StreamSecurityUpgradeInitiator, обязательно переопределите метод GetNextUpgrade, чтобы вернуть типы контента для потока сжатия и безопасного потока в указанном порядке.
Создайте подкласс StreamSecurityUpgradeAcceptor, который понимает пользовательские типы контента в методе CanUpgrade.
Поток будет обновлен после каждого вызова GetNextUpgrade и CanUpgrade.