Как можно скорее инициализация WCF дуплексного канала nettcp - PullRequest
0 голосов
/ 29 января 2012

В моих клиент-серверных приложениях я хочу, чтобы для связи со своим сервером был доступен один дуплексный канал WCF - своего рода фоновое соединение, которое не является строго обязательным для запуска клиентского приложения, но желательно для отчета о состоянии на сервер. У меня есть Ping() вызов и Echo() обратный вызов в IServerContract и IClientContract соответственно.

Я реализую class ServerProxy : System.ServiceModel.DuplexClientBase<IServerContract> с методами сквозного доступа к base.InnerChannel.

Если я создаю var proxy = new ServerProxy(...) в своем клиенте, я могу просто начать вызывать proxy.Ping(), и WCF автоматически откроет соединение для первого вызова и сразу после этого выполнит операцию вызова. Однако первый вызов всегда занимает ~ 10 секунд из-за инициализации канала и аутентификации. (Я использую проверку подлинности Windows, безопасность на основе сообщений, EncryptAndSign.) Последующие вызовы выполняются быстрее.

Я считаю, что эти 10 секунд неизбежны, но обычно есть время до первого вызова клиента к серверу, в течение которого может произойти эта инициализация. Поэтому вместо того, чтобы ждать функции автоматического открытия DuplexClientBase, я рано открываю канал с помощью вызова proxy.InnerDuplexChannel.Open(). (proxy.Open() выдает исключение , и эта косвенность, кажется, его избегает.)

К сожалению, аутентификация канала клиент-сервер не также аутентифицирует канал обратного вызова сервер-клиент. Вместо этого первый звонок от сервера к клиенту ТАКЖЕ требует ~ 10 секунд. Так как я использую привязку netTcp, я удивлен этим, но я предполагаю, что это ожидается сейчас.

Как можно также превентивно открыть канал обратного вызова?

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

Подсказка (?) : я полагаю, что этот код должен был бы идти в месте в конвейере / жизненном цикле WCF, где у сервера есть возможность выполнять пользовательские действия при подключенном к клиенту событии (и ПЕРЕД любой операцией сообщение передается). Эта точка интеграции до сих пор ускользнула от меня.

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