Управление службой 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/
Я получаю значение "Не удается получить имя службы" в модели, прикрепленной к представлению.
Может кто-нибудь сказать мне, пожалуйста, что я делаю не так или указать мне рабочий образец? Или, может быть, скажите мне, как то, что я описал выше, может быть достигнуто должным образом.
Спасибо.