使用自托管NancyFX Web界面控制Windows服务(启动,停止等等)

时间:2016-03-25 09:07:11

标签: c# wcf windows-services nancy self-hosting

我的目标是为Windows服务创建一个简单的Web界面,允许我使用Web浏览器与服务进行交互。

通过交互我的意思是通过按下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();           
     }    
}

在为Nancy定义的MainModule中,我需要访问dbSynchronizer类的当前isntance(当前正在服务主机内执行)以获取对方法和属性的访问权限。 首先,我只想要一个简单的视图,它将显示如下服务的名称:

文件: 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 个答案:

没有答案