Служба Windows, подключающаяся к другой службе через wcf, падает - PullRequest
0 голосов
/ 25 марта 2011

У меня есть две службы Windows.Один («сервер») действует как хост WCF, к которому подключается другой («клиент»).Поэтому я настроил зависимость от client до server .Оба также настроены на автоматический запуск.

Когда я запускаю эти службы вручную, все работает нормально.Когда я останавливаю обе службы и приказываю client запустить, тогда server будет запущен до client , и все в порядке.

Однако, когдаЯ перезагружаю машину только сервер запущен.

Когда я добавляю диагностического слушателя, я вижу, что он получил TimeoutException с полезным сообщением:

Превышен установленный тайм-аут 00:00:00 для HTTP-запроса «http://[server address]».Время, отведенное для этой операции, могло быть частью более длительного времени ожидания.

На какой-то другой вопрос SO был ответ , который утверждает, что WCF, вероятно, запуталсячто пошло не так и поэтому начинает лгать о тайм-ауте.

Возможно, я пропустил зависимость для какой-либо службы?Требуется ли WCF то, что не было или запускается, когда клиент пытается связаться с сервером ?

Ответы [ 2 ]

2 голосов
/ 27 марта 2011

Настройка зависимости между двумя службами Windows не обязательно достаточна, чтобы избежать условия гонки: то есть, чтобы клиентская служба не вызывала службу WCF до полной инициализации стека канала WCF сервера.

Зависимость службы просто гарантирует, что диспетчер управления службами Windows не запустит процесс обслуживания клиентов, пока серверная служба Windows не уведомит SCM о том, что он запущен. Достаточно ли этого, зависит от того, как вы пишете сервер.

Если служба сервера запускает новый поток для инициализации стека WCF, ваш метод OnStart, вероятно, возвращается до того, как стек WCF будет готов для клиентов. Затем возникает условие состязания относительно того, будет ли первый вызов клиента успешным.

С другой стороны, если служба сервера не возвращается из OnStart (и, таким образом, не уведомляет SCM о том, что она запущена) до тех пор, пока стек канала не будет полностью открыт, зависимость удаляет условие гонки, но существует другая ловушка: вам нужно знать, что собственный тайм-аут SCM для запуска службы Windows не запускается при ожидании инициализации стека WCF, что вполне может произойти при перезагрузке, если, например, служба WCF зависит от сетевого стека. Если OnStart сервера не возвращается в течение времени ожидания SCM, SCM вообще не будет пытаться запустить службу зависимого клиента, поскольку он не получает уведомление о запуске сервера. (В журнале событий Windows появится сообщение от SCM о том, что служба сервера не была запущена в течение ожидаемого времени.) Вы можете увеличить время ожидания SCM, вызвав ServiceBase.RequestAdditionalTime во время инициализации службы WCF.

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

Вы на самом деле не говорите, какую привязку вы используете. Если клиентские и серверные службы всегда работают на одном компьютере, как вы, вероятно, указываете, тогда подумайте об использовании NetNamedPipeBinding: тогда ваша служба не будет зависеть от инициализации сетевых ресурсов, и запуск должен быть более быстрым.

2 голосов
/ 26 марта 2011

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

Дополнительным быстрым обходным путем, который вы можете сделать, является настройка параметров восстановления для вашей службы - например, вы можете настроить ее для перезапуска службы при сбое после некоторого времени ожидания - вы можете сделать это через пользовательский интерфейс в services.msc или вкомандная строка с помощью команды sc config.

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