Topshelf не вызывает запуск сервиса - PullRequest
0 голосов
/ 29 октября 2018

Я наблюдаю различное поведение в Topshelf в зависимости от того, запускаю ли я приложение в автономном режиме или устанавливается в качестве службы. Я пробовал Topshelf 3.3.1 и 4.1.

Я использую сервис, который реализует ServiceControl, который отлично работает в автономном режиме. При попытке запустить установленную службу я получаю сообщение о том, что службе потребовалось слишком много времени для ответа на контрольные запросы.

var resultCode = HostFactory.Run(x =>
{
    x.Service<ServiceControl>(sc =>
    {
        sc.ConstructUsing(() =>
        {
            Console.WriteLine("GET INSTANCE!");
            return new WorkerService();
        });
        sc.WhenStarted((s, h) =>
        {
            Console.WriteLine("START!");
            return s.Start(h);
        });
        sc.WhenStopped((s, h) =>
        {
            Console.WriteLine("STOP!");
            return s.Stop(h);
        });
        sc.BeforeStartingService(() => Console.WriteLine("BEFORE START!"));
    });

    x.SetDescription("WorkerService");
    x.SetDisplayName("WorkerService");
    x.SetServiceName("WorkerService");
});

Это очень подробная версия вызова службы (с большим количеством выводов на консоль), но даже вызовы ConstructUsing или BeforeStartingService не производят никакого вывода на консоль, в то время как вызовы журнала внутри Service<> выход лямбда-продукции.

Я оставлен здесь совершенно невежественным, но также не смог воспроизвести это с минимальной выборкой. Тайм-аут наступает примерно через 3-4 секунды, без каких-либо видимых попыток запустить службу. Запуск служебного потока из основной программы работает без исключения.

Запуск службы с WorkerService.exe работает должным образом, запуск с WorkerService.exe start (запускает службу) не работает.

Поскольку это происходит с Topshelf 3 и 4, скорее всего, я что-то не так делаю внутри приложения. Любой указатель в правильном направлении очень ценится.

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Теперь у меня есть инициатива: в рамках загрузки конфигурации мы загружаем файл из перемещаемых AppData, и похоже, что если файл недоступен, возникает исключение и молча отбрасывается. Если файл не существует, служба запускается как положено, и все работает.

Таким образом, основная проблема заключается в том, что перед запуском части конфигурации службы Topshelf было сгенерировано неперехваченное исключение, которое, по-видимому, используется для пересылки некоторого вывода в приложение командной строки при вызове exe с параметром start.

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

0 голосов
/ 29 октября 2018

Вы зарегистрировали WorkerService как ServiceControl? Если нет, зарегистрируйте сервис. (Вы используете Autofac?). Если нет, попробуйте предоставить

x.Service<WorkerService>(sc => // Your code

вместо ServiceControl

...