Topshelf - запуск потоков на основе пользовательских параметров

Я сделал верхний веб-сервис, который использует пользовательский параметр:

        string department = null;



        // *********************Below is a TopShelf code*****************************//
        HostFactory.Run(hostConfigurator =>
        {
            hostConfigurator.AddCommandLineDefinition("department", f => { department = f; });  //Define new parameter
            hostConfigurator.ApplyCommandLine();                                                //apply it  

            Helpers.LogFile("xxx", "Got department:"+department);  

            hostConfigurator.Service<MyService>(serviceConfigurator =>
            {
                serviceConfigurator.ConstructUsing(() => new MyService(department));                   //what service we are using
                serviceConfigurator.WhenStarted(myService => myService.Start());             //what to run on start    
                serviceConfigurator.WhenStopped(myService => myService.Stop());              // and on stop   
            }
            );
           hostConfigurator.RunAsLocalService();


            //****************Change those names for other services*******************************************//
            string d = "CallForwardService_" + department;

            hostConfigurator.SetDisplayName(d);
            hostConfigurator.SetDescription("CallForward using Topshelf");
            hostConfigurator.SetServiceName(d);


        });


...
public class MyService

string depTask;
public MyService(string d)
    {


        //***********************Three tasks for three different destinations***********************


        depTask = d;
           _taskL = new Task(Logistics);
           _taskP = new Task(Planners);
           _taskW = new Task(Workshop);
           Helpers.LogFile(depTask, "started working on threads for "+d);   
public void Start()
    {

             if (depTask == "logistics")
        {
            _taskL.Start();
            Helpers.LogFile(depTask, "proper thread selected");      
        }
        ...   

куда Helpers.logfile просто пишет в текстовый файл. Аа видно из кода над параметром department передается в MyService(string d), Все отлично работает, когда я отлаживаю, используя в качестве параметра отладки то есть "-department:workshop". Но когда я пытаюсь установить программу как службу, используяcallforward.exe install -department:logistics Я создаю сервис callforwardservice_logistics но когда я проверяю журнал, параметр не был передан MyService.

Что я делаю неправильно?

1 ответ

Похоже, что по умолчанию Topshelf не поддерживает добавление пользовательских параметров в конфигурацию запуска службы и после установки ImagePath значение под HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MyService не содержит дополнительного параметра -department:..., Вы могли бы наследовать по умолчанию WindowsHostEnvironment и перегрузить Install метод, но я думаю, что было бы проще (возможно, менее приятным) просто добавить следующий код в код конфигурации вашего хоста:

    // *********************Below is a TopShelf code*****************************//
    HostFactory.Run(hostConfigurator =>
    {
        ...
        hc.AfterInstall(ihc =>
        {
            using (RegistryKey system = Registry.LocalMachine.OpenSubKey("System"))
            using (RegistryKey currentControlSet = system.OpenSubKey("CurrentControlSet"))
            using (RegistryKey services = currentControlSet.OpenSubKey("Services"))
            using (RegistryKey service = services.OpenSubKey(ihc.ServiceName, true))
            {
                const String v = "ImagePath";
                var imagePath = (String)service.GetValue(v);
                service.SetValue(v, imagePath + String.Format(" -department \"{0}\"", department));
            }
        });
        ...
    }

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

Так что в моем случае вместо этого

callforward.exe install -department"logistics"

Я использовал

callforward.exe install -department"logistics" -instance:logistics

А затем запустите экземпляр по имени экземпляра:

net start CallForwardService_$logistics

Это позволяет мне создавать несколько экземпляров одной и той же службы с разными именами, управляемыми параметром:

Другие вопросы по тегам