TopShelf - служба запускается, но ничего не работает - PullRequest
0 голосов
/ 08 октября 2019

Я написал простой код, который должен запускаться автоматически с использованием topshelf. Проблема в том, что он запускается без проблем, если я запускаю его из Visual Studio или просто щелкаю в папке отладки в exe-файле, но .... когда я устанавливаю его как службу, он ничего не делает ...

Итак, вот мой код

using System;
using System.Collections.Generic;
using Topshelf;
using System.IO;

namespace ConsoleCRP
{    
    public class Program
    {
        public static void Main(){
                var rc = HostFactory.Run(x =>{
                    x.Service<ClientReportingScheduler>(s =>                                   
                    {
                        s.ConstructUsing(name => new ClientReportingScheduler());                                    
                        s.WhenStarted(tc => tc.Start());                         
                        s.WhenStopped(tc => tc.Stop());                          
                    });
                    x.StartAutomatically();
                    x.RunAsLocalSystem();                                       

                    x.SetDescription("This is automatic scheduler");                  
                    x.SetDisplayName("scheduler");                                  
                    x.SetServiceName("servicetest");                                  
                });                                                             

                var exitCode = (int)Convert.ChangeType(rc, rc.GetTypeCode());  
                Environment.ExitCode = exitCode;
            }
        }
    public class ClientReportingScheduler
        {
            public System.Timers.Timer _timer;
            public int startJob = 0;

            public ClientReportingScheduler()
            {
                startJob = 1000 * 5 ;

                _timer = new System.Timers.Timer(startJob) { AutoReset = true };
                _timer.Elapsed += (sender, eventArgs) =>
                {
                    Console.WriteLine("Starting scheduler query check at {0}" + Environment.NewLine, DateTime.Now);     
                };
            }

            public void Start()
            {
                _timer.Start();
            }
            public void Stop()
            {
                _timer.Stop();
            }
    }

}

Я скопировал образец из документации верхнего отдела, и в этом коде есть только небольшие изменения. Я вставил сюда только облегченную версию этого (просто чтобы показать вам проблему). В полной версии я также использовал fluentscheduler, и есть много кода, который подключается к postgress, получает некоторые данные и выполняет некоторые хранимые процедуры, но это не проблема. Проблема в том, что даже этот небольшой код, который вы видите выше, вообще не работает. Вы можете создать эту программу сейчас, если вы запустите новое консольное приложение и просто вставите его туда (и, конечно, добавите topshelf из nuget). Если вы запустите его, он должен работать, но если вы устанавливаете его как сервис, он вообще не работает ...

Вот также шаги, которые я сделал при установке в качестве сервиса:
1) открытьCMD как администратор
2) перейдите в каталог с отладкой
3) установите его таким образом: ConsoleCRP.exe install
4) запустите службу: net start servicetest
5) если вы хотите остановитьслужба: net stop servicetest
6) если вы хотите отменить удаление: ConsoleCRP.exe удалить

Вот результат:
Результат конфигурации:
[Успех] Имя servicetest
[Успех] Планировщик DisplayName
[Успех] Описание Это автоматический планировщик
[Успех] ServiceName servicetest
Topshelf v4.2.1.215, .NET Framework v4.0.30319.42000
Служба servicetestтеперь запущен, нажмите Control + C для выхода.
Запуск проверки запроса планировщика в 08/10/2019 16: 31: 12

Запуск проверки запроса планировщика в 08/10/2019 16:31:17

Запуск запроса планировщика check at 08/10/2019 16: 31: 22 * ​​1029 *

Запуск проверки запросов планировщика в 08/10/2019 16: 31: 27

Так скажите, что не так в этом коде, которыйэто просто не работает как услуга ... ?? заранее благодарю за помощь!

1 Ответ

0 голосов
/ 08 октября 2019

Я нашел проблему ... Было 2 проблемы. Во-первых, когда это сервис, он вообще не будет открывать консольное приложение, и если вы хотите что-то увидеть, вы должны записать его, например, в текстовый файл ...

секунда (в моем полном проекте) была то, что я былписать все, используя мой собственный регистратор, который писал файл, используя AppDomain.CurrentDomain.BaseDirectory ... кажется, что это не разрешено, когда это серьезно, и вы должны записать журнал в другом месте.

ина самом деле, когда я решил все это, я обнаружил, что для службы также невозможно открыть файлы на некоторых серверах ... поэтому, если есть какие-либо пути, такие как \ server \ folder \ subfolder \ file.txt, служба не будетоткройте этот файл ... по крайней мере, в моем случае.

Так что я думаю, что дело решено, но, возможно, тот, у кого возникла эта проблема, увидит этот ответ, и он поможет ....

...