Обзор надежных сеансов

Надежная передача сообщений в Windows Communication Foundation (WCF) SOAP обеспечивает сквозную надежность передачи сообщений между конечными точками SOAP. Это делается в сетях, которые являются ненадежными путем преодоления сбоев транспорта и сбоев на уровне сообщений SOAP. В частности, она обеспечивает доставку сообщений на основе сеансов, единую доставку и (при необходимости) упорядоченную доставку через протокол SOAP или транспортных посредников. Доставка сообщений на основе сеанса позволяет групповую передачу сообщений в сеансе с необязательным их упорядочиванием.

В этом разделе описаны надежные сеансы, способы их использования и способы их защиты.

Надежные сеансы WCF

Надежные сеансы WCF — это реализация надежного обмена сообщениями SOAP, как определено протоколом WS-ReliableMessaging.

Надежный обмен сообщениями WCF SOAP предоставляет сквозной надежный сеанс между двумя конечными точками независимо от количества или типа посредников, разделяющих конечные точки обмена сообщениями. К ним относятся все посредники транспорта, которые не используют SOAP (например, прокси-серверы HTTP) или посредники, использующие SOAP (например, маршрутизаторы или мосты на основе SOAP), необходимые для передачи сообщений между конечными точками. Надежный канал сеансов поддерживает интерактивное взаимодействие, чтобы службы, подключенные к такому каналу, выполнялись одновременно и обмениваются, и обрабатывают сообщения в условиях низкой задержки, то есть в течение относительно коротких интервалов времени. Эта связь означает, что эти компоненты прогрессируют вместе или терпят неудачу вместе, поэтому между ними не предусмотрена изоляция.

Надежный сеанс маскирует два типа сбоев:

  • Сбои на уровне сообщения SOAP, включая потерянные или повторяющиеся сообщения и сообщения, поступающие в другой порядок, в котором они были отправлены.

  • Сбои транспорта.

Надежный сеанс реализует протокол WS-ReliableMessaging и окно передачи в памяти для маскирования сбоев на уровне сообщения SOAP и повторно устанавливает подключения в случае сбоев транспорта.

Надежный сеанс обеспечивает для сообщений SOAP то же, что TCP обеспечивает для IP-пакетов. Подключение сокета TCP обеспечивает единую, упорядоченную передачу IP-пакетов между узлами. Надежный канал обеспечивает тот же тип надежной передачи, но отличается от надежности сокета TCP следующим образом:

  • Надежность находится на уровне сообщения SOAP, а не для произвольного размера пакета байтов.

  • Надежность нейтральна к транспортному уровню и не ограничивается только передачей по TCP.

  • Надёжность сеанса не привязана к определённому сеансу передачи данных (например, к сеансу, который обеспечивает TCP-подключение) и может использовать несколько сеансов передачи данных одновременно или последовательно в течение всего срока надёжного сеанса.

  • Надежный сеанс устанавливается между конечными точками SOAP отправителя и приемника, вне зависимости от количества транспортных подключений, необходимых для их связи. Короче говоря, надежность TCP заканчивается, когда заканчивается транспортное подключение, а надежный сеанс обеспечивает сквозную надежность.

Надежные сеансы и привязки

Как упоминалось ранее, надежный сеанс является независимым от транспорта. Кроме того, можно установить надежный сеанс для многих шаблонов обмена сообщениями, таких как запрос-ответ или дуплекс. Надежный сеанс WCF представлен как свойство набора привязок.

Используйте надежный сеанс для конечных точек, которые используют:

  • Стандартные привязки транспорта на основе HTTP:

    • WsHttpBinding и предоставление контрактов с запросом и ответом на запрос или односторонние контракты.

    • При использовании надежного сеанса при контракте типа запрос-ответ или простом одностороннем контракте службы.

    • WsDualHttpBinding и предоставление доступа к дуплексным, запросно-ответным или односторонним контрактам.

    • WsFederationHttpBinding и предоставление контрактов с запросом и ответом на запрос или односторонние контракты.

  • Стандартные привязки транспорта на основе TCP:

    • NetTcpBinding и публикация дуплексных, запрашиваемых ответов или односторонних контрактов.

Используйте надежный сеанс для любых других привязок, создав пользовательскую привязку, например HTTPS (дополнительные сведения о проблемах, см. в разделе "Надежные сеансы и безопасность") или именованной привязки канала.

Вы можете создавать надёжный сеанс на различных типах базовых каналов, и конфигурация канала надёжного сеанса меняется в зависимости от этого. Как на клиенте, так и на сервере тип поддерживаемого канала надежных сеансов зависит от типа используемого базового канала. В следующей таблице перечислены типы каналов сеансов, поддерживаемые клиентом в качестве функции базового типа канала.

Поддерживаемые типы каналов для надежных сеансов† IRequestChannel IRequestSessionChannel IDuplexChannel IDuplexSessionChannel
IOutputSessionChannel Да Да Да Да
IRequestSessionChannel Да Да нет нет
IDuplexSessionChannel нет нет Да Да

† Поддерживаемые типы каналов — это значения, доступные для значения универсального TChannel параметра, передаваемого в BuildChannelFactory<TChannel>(BindingContext) метод.

В следующей таблице перечислены типы каналов сеансов, поддерживаемые на сервере в качестве функции базового типа канала.

Поддерживаемые типы надежных сеансовых каналов. IReplyChannel IReplySessionChannel IDuplexChannel IDuplexSessionChannel
IInputSessionChannel Да Да Да Да
IReplySessionChannel Да Да нет нет
IDuplexSessionChannel нет нет Да Да

•Поддерживаемые типы каналов — это значения, доступные для универсального TChannel значения параметра, передаваемого в BuildChannelListener<TChannel>(BindingContext) метод.

Надежные сеансы и безопасность

Защита надежного сеанса важна, чтобы убедиться, что стороны связи (служба и клиент) проходят проверку подлинности, и что сообщения, обменяемые в сеансе, не будут изменены. Кроме того, важно обеспечить целостность каждого отдельного надежного сеанса. Надежный сеанс защищается путем привязки его к контексту безопасности, который представлен и управляется каналом сеансов безопасности. Канал безопасности предоставляет сеанс защиты. Маркеры безопасности, обменяемые во время создания сеанса, затем используются для защиты сообщений в надежном сеансе.

Когда надежный сеанс выполняется через TCP-S, сеанс TCP привязан к надежному сеансу. Поэтому безопасность транспорта гарантирует, что безопасность также привязана к надежному сеансу. В этом случае восстановление соединения выключено.

Единственным исключением является использование HTTPS. Сеанс SSL не привязан к надежному сеансу. Это налагает угрозу, так как сеансы, которые совместно используют контекст безопасности (сеанс SSL), не защищены друг от друга; это может быть или не может быть реальной угрозой в зависимости от приложения.

Использование надежных сеансов

Чтобы использовать надежные сеансы WCF, создайте конечную точку с привязкой, поддерживающей надежный сеанс. Используйте одну из системных привязок, которые WCF предоставляет с включенным надежным сеансом или создайте собственную пользовательскую привязку, которая делает это.

Системные привязки, которые поддерживают и включают надежный сеанс по умолчанию:

Предоставляемые системой привязки, которые поддерживают надежный сеанс как вариант, но по умолчанию не включают его:

Пример создания пользовательской привязки см. в статье "Практическое руководство. Создание пользовательской привязки надежного сеанса с помощью HTTPS".

Чтобы подробнее ознакомиться с привязками WCF, поддерживающими надежные сеансы, см. в разделе System-Provided Привязки.

Когда следует использовать надежные сеансы

Важно понимать, когда следует использовать надежные сеансы в приложении. WCF поддерживает надежные сеансы между активными и живыми конечными точками одновременно. Если приложению требуется, чтобы одна из конечных точек была недоступна в течение длительного времени, используйте очереди для обеспечения надежности.

Если для сценария требуется две конечные точки, подключенные по протоколу TCP, может быть достаточно tcp, чтобы обеспечить надежный обмен сообщениями. Хотя использовать надежное соединение не нужно, так как TCP гарантирует, что пакеты прибывают в правильном порядке и единожды.

Если в вашем сценарии есть какие-либо из следующих характеристик, необходимо серьезно рассмотреть возможность использования надежного сеанса.

  • Посредники SOAP, такие как маршрутизаторы SOAP

  • Посредники-прокси или транспортные шлюзы

  • Прерывистое соединение

  • Сеансы по протоколу HTTP

См. также