Управление службой Windows ("Пуск", "Стоп" и т. Д.) С помощью собственного веб-интерфейса NancyFX

Моя цель - создать простой веб-интерфейс для службы Windows, который позволит мне взаимодействовать с этой службой с помощью веб-браузера.

Под взаимодействием я подразумеваю, что, нажав кнопку на html-странице, я смогу вызвать Stop() метод, определенный внутри класса обслуживания. (или любые другие доступные методы)

У меня есть класс, который будет размещен внутри ServiceHost, работающего как служба Windows. Иерархия следующая:

public interface IMyServiceInterface
{
        string Name { get; set; }
        void Stop();
}

public class MyServiceBase : IMyServiceInterface
{
  string sName;
  public string Name
  {
    get {return sName; }
    set {sName = value;}
  }

  public virtual void Stop() {}
}

public class dbSynchronizer : MyServiceBase 
{
   public dbSynchronizer()
   {
      this.Name = "dbSynchronizer_01";
   }

   public override void Stop()
   {
      base.Stop();
    }
}

Код для запуска хостов:

Файл: Program.cs

static void Main(string[] args)
{
   ServiceBase[] ServicesToRun; 
   ServicesToRun = new ServiceBase[]
   {
     new dbSynchronizerService()
   };
   ServiceBase.Run(ServicesToRun);
}

Файл: dbSynchronizerService.cs

public partial class dbSynchronizerService : ServiceBase
{    
   NancyHost nancyHost;
   dbSynchronizer  dbSynchronizerService;

   protected override void OnStart(string[] args)
   {

      dbSynchronizerInstance = new dbSyncronizerLib.dbSynchronizer();

      CustomBootstrapper _custBootStrapper = new CustomBootstrapper();
      nancyHost = new Nancy.Hosting.Self.NancyHost(new                 Uri("http://localhost:9664"), _custBootStrapper);                

      if (nancyHost != null)
          nancyHost.Start();

      sHost = new ServiceHost(dbSynchronizerInstance);
      sHost.Open();           
     }    
}

Внутри MainModule, определенного для Nancy, мне нужно получить доступ к текущему isntance класса dbSynchronizer (в настоящее время выполняется внутри хоста службы), чтобы получить доступ к методам и свойствам. Для начала я просто хочу простой вид, который будет отображать название службы, как показано ниже:

Файл: MainModule.cs:

public class MainModule : NancyModule
    {
        public IMyServiceInterface _myService;

        public MainModule(IMyServiceInterface _service)
        {
            _myService= _service;

            Get["/"] = x =>
            {

                var model = new ConfigStatusModel
                {
                    Message = String.IsNullOrEmpty(_service.Name) ? "Cannot get service name" : _service.Name
                };

                return View["index.html", model];
            };
        }
    }

После этого шага я также хотел бы сделать несколько POST для некоторых других модулей, чтобы вызвать методы, такие как Stop() или любые другие методы, которые должны быть вызваны вмешательством человека: DoSyncDb(), CleanTable().

На этом этапе при запуске службы и запросе http://localhost:9664/ Я получаю значение "Не удается получить имя службы" в модели, прикрепленной к представлению.

Может кто-нибудь сказать мне, пожалуйста, что я делаю не так или указать мне рабочий образец? Или, может быть, скажите мне, как то, что я описал выше, может быть достигнуто должным образом.

Спасибо.

0 ответов

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