WCF - заставить клиента проверить доступность сервиса [дубликат]
-
22-07-2019 - |
Вопрос
На этот вопрос уже есть ответ здесь:
- проверьте доступность веб-службы WCF 4 ответа
У меня есть клиент-серверная система, обе стороны написаны мной, и я хотел бы перевести клиентов в "автономное" состояние, когда сервер отключается / умирает, а затем автоматически вернуть их в "онлайн", когда сервер снова станет доступен.
В первой части я прослушиваю события с ошибкой в канале и обрабатываю это, переводя клиент в автономный режим.Затем я начинаю вызывать службу 'ping' на сервере (каждые 30 секунд), которая просто возвращает bool, если он активен.Как только он активируется, клиент получает bool и снова подключается к сети.
Все это работает, проблема, с которой я сталкиваюсь, заключается в том, что когда клиент вызывает службу ping и сервер не работает, ответ не отправляется (очевидно), и в конце концов, примерно через 2 минуты я получаю исключение endpoint not found.К этому времени я уже попробовал еще 3-4 пинга и, следовательно, у меня назревают 3-4 исключения.
Мой вопрос в том, как я могу более изящно обращаться со службой ping?В идеале я хотел бы периодически вызывать службу, которая сообщает мне, подключена ли она к сети, и мгновенно сообщает мне, если это не так.
Решение
А как насчет этого:
- если вы обнаружите отключение сервера, введите режим "Ping".
- в "режиме ping" вы устанавливаете "SendTimeout" клиента на что-то очень короткое, напримерчто-то около 2 секунд или около того, поскольку на ваш вызов метода Ping службы должен быть дан ответ почти немедленно
- как только ваш "Ping" сработает успешно, вы снова воссоздаете клиентский прокси-сервер и устанавливаете для клиента "SendTimeout" исходное значение (по умолчанию 1 минута - зависит от того, что имеет смысл для вас, 15 секунд, 30 секунд - неважно).
Таким образом, если вы находитесь в "режиме Ping", вы быстро получаете ответы (или тайм-ауты) и можете быстро определить доступность сервиса.