2015-04-24 2 views
1

Я сделал Topshelf WebService, который использует пользовательский параметр: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 просто записывает в текстовый файл. Aa вы можете видеть из кода выше параметра department передается MyService(string d). Все работает отлично, когда я отлаживаю, используя «-department: workshop» в качестве параметра отладки. Но когда я пытаюсь установить программу как услугу, используя callforward.exe install -department:logistics Я создаю службу callforwardservice_logistics bu, когда я проверяю журнал, этот параметр не был передан на MyService.

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

ответ

2

Похоже, что по умолчанию 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)); 
      } 
     }); 
     ... 
    } 
+0

Это весьма востребованная функция, хотя, и будет приветствовать запрос тянуть. Я уверен, что доберусь до него в конце концов, на этом радаре это просто ничего не стоит. –

Смежные вопросы