我的目标是为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/
时,我在附加到视图的模型中得到“无法获取服务名称”值。
有人可以告诉我我做错了什么或者指出我的工作样本吗?或者也许告诉我如何才能正确实现上述目标。
谢谢。