C# 使用自托管NancyFX web界面控制Windows服务(启动、停止等…)
我的目标是为windows服务创建一个简单的web界面,允许我使用web浏览器与该服务交互 通过交互,我的意思是通过在html页面中按下按钮,我将能够调用服务类中定义的C# 使用自托管NancyFX web界面控制Windows服务(启动、停止等…),c#,wcf,windows-services,nancy,self-hosting,C#,Wcf,Windows Services,Nancy,Self Hosting,我的目标是为windows服务创建一个简单的web界面,允许我使用web浏览器与该服务交互 通过交互,我的意思是通过在html页面中按下按钮,我将能够调用服务类中定义的Stop()方法。(或任何其他可用方法) 我有一个类将被托管在ServiceHost中,作为Windows服务运行。 层次结构如下所示: public interface IMyServiceInterface { string Name { get; set; } void Stop(); }
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);
}
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();
}
}
文件:dbSynchronizerService.cs
static void Main(string[] args)
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new dbSynchronizerService()
};
ServiceBase.Run(ServicesToRun);
}
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定义的main模块中,我需要访问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];
};
}
}
在这一步之后,我还想发布一些其他模块的帖子,以调用方法,如Stop()
或任何其他应该由人工干预触发的方法:DoSyncDb(),CleanTable()。
此时,当运行服务并请求http://localhost:9664/
我在附加到视图的模型中获取“无法获取服务名称”值
有人能告诉我我做错了什么,或者给我指一个工作样本吗?或者告诉我怎样才能正确地实现我上面所描述的
多谢各位