Мне пришлось немного «уточнить» свой предыдущий ответ, удалив все это:)
Итак, вот короткая, лучшая версия. Не самый лучший, но работает довольно хорошо.
Чтобы упростить объяснение, давайте рассмотрим, что у вас есть один сервис и клиент, который хочет его использовать.
- добавить приложение прокси-сервера, которое запускается за пределами брандмауэра и предоставляет 2 службы:
первый идентичен исходному сервису (тот же адрес, обязательный, договор)
вторая - дуплексная служба, которая имеет в качестве своего обратного вызова тот же контракт вышеуказанной услуги
- добавить клиентское приложение прокси, которое работает внутри брандмауэра и использует вторую службу прокси-сервера, а также исходную службу
- исходный клиент будет использовать прокси-сервер вместо исходного сервиса
Как это работает:
- прокси-клиент подключается к прокси-серверу и регистрирует обратный вызов
- прокси-клиент также подключается к исходному сервису
- исходный клиент подключается к прокси-сервису
- прокси-сервер перенаправляет все вызовы от сервиса на обратный вызов (помните, что контракты совпадают)
- прокси-клиент перенаправляет все вызовы из реализации обратного вызова клиенту исходной службы (опять же, контракты совпадают)
- Исходный сервис обрабатывает вызов и возвращает результат
- ответы отправляются обратно в обратном порядке до первоначального клиента
Обратите внимание, что оригинальный клиент не знает, что он подключается к прокси-серверу, а не к исходной службе
Еще одно замечание: пересылка происходит в коде, что не очень приятно. WCF в .NET 4.0 имеет поддержку маршрутизации, но я не уверен, что вы можете маршрутизировать только канал обратного вызова, а не прямой.
Надеюсь, это поможет,
Gicanu