В моих клиент-серверных приложениях я хочу, чтобы для связи со своим сервером был доступен один дуплексный канал 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, где у сервера есть возможность выполнять пользовательские действия при подключенном к клиенту событии (и ПЕРЕД любой операцией сообщение передается). Эта точка интеграции до сих пор ускользнула от меня.