Оглавление:
- WCF service. С чего начать. Основные моменты создание службы.
- WCF. Callback через BasicHttpBinding без дуплексной связи.
- Realtime WCF Tracker вызовов клиентского приложения.
- Как отключить публикацию метаданных mex WCF сервисом.
В данной статье я хочу поделиться с вами примером того, как можно в
WCF инициировать передачу данных с сервера на клиент используемые
BasicHttpBinding в качестве привязки для взаимодействия.
Как вам должно быть известно, для того, что бы сервер выступа в качестве инициатора передачи данных на клиент используя
WCF, ему надо использовать одну из схем ниже:
Duplex связь покрывает наши запросы, но есть одно "но" - привязка (
Binding) должена поддерживать работу с использованием сессии. А
BasicHttpBinding (на основе протокола
HTTP) в силу своей природы не может поддерживать сессию (постоянное
TCP соединение), так как работает по схеме "Запрос-ответ".
Как же тогда поступить?
WSDualHttpBinding привязка.
Для работы через
HTTP транспорт, с возможностью использования
Duplex связи, специально был создан
WSDualHttpBinding, который, для имитации сессии, используя
HTTP заголовок, добавляя туда техническую информацию. А для обратного соединения сам создаёт подключение к клиенту. Замечу, что обратное соединение создаётся через
WCF engine, и используется как при работе с любой другой привязкой, а не программистом, при первом подключении клиента. В качестве обратного соединения используются подключения на 80 (по умолчанию) порт клиента со стороны сервера, когда надо передать данные.
Все было бы хорошо, но в какой то момент, может возникнуть ситуация, когда клиент будет находиться за
NAT, что приводит к невозможности подключиться к нему сервером. Почему? Читайте как работает
NAT, он разрешает соединения из внутренней сети, но запрещает подключения из внешней (за маршрутизатором). В это случае выходом может быть лишь привязки на основе протокола
TCP (
NetTcpBinding), в которые, для обратного и прямого соединения, используется одно
TCP соединение. Но что, если нам нужно как то через
HTTP производить обратный вызов клиента.