Можно ли создать WCF "обратный" канал TCP? - PullRequest
2 голосов
/ 06 марта 2009

Обычно канал WCF TCP устанавливает соединение с хостом, а затем позволяет выполнять вызовы методов через него.

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

Я подозреваю, что это какой-то специальный канал, но подумал, а) это уже было сделано б) были ли какие-либо подводные камни, которые я должен попытаться избежать

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

Сиз предполагает, что это так же просто, как использовать дуплексный контракт. Чтобы немного расширить требования: а) Клиенту запрещено устанавливать соединения с сервером. Поэтому, если дуплексный канал устанавливает отдельное TCP-соединение, это не сработает. Я думаю из моих тестов, что он не разделяет исходное соединение под tcp (кто-нибудь может подтвердить?)

b) На сервере есть несколько служб, которые клиент должен вызывать, поэтому механизм обратного соединения «обратного вызова» будет неудобным, так как для их получения потребуется много вызовов в стиле «регистрация». настроить. В идеале я хотел бы настроить несколько служб одновременно - возможно ли это с помощью этого подхода?

1 Ответ

3 голосов
/ 06 марта 2009

Взгляните на MSDN здесь . NetTcpBinding поддерживает двустороннюю связь.

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

Дуплексная связь означает не функции обратного вызова, а целый контракт. Когда клиент открывает дуплексное соединение с хостом, он в конечном итоге запускает собственный сервер, который прослушивает входящие вызовы с сервера по дескриптору контракта обратного вызова. Любое отправленное сообщение клиент -> сервер или сервер -> клиент пройдет через всю стандартную инфраструктуру WCF.

Справедливо сказать, что это не совсем отвечает на ваш вопрос. Однако для создания любого канала вам потребуется инициатор соединения, чтобы сначала связаться с каким-либо сервером. Таким образом, самый простой способ сделать это - дуплексное соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...