我需要为我正在构建的Web应用程序执行一些后台任务。我喜欢使用Topshelf在服务器上运行服务的外观。我想知道初始化服务的最佳方式。我想知道从MVC应用程序启动启动服务是不是一个坏主意
例如:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
InitService();
}
private void InitService()
{
Task.Factory.StartNew(() => HostFactory.Run(x =>
{
x.Service<TestService>(s =>
{
s.SetServiceName("TestService");
s.ConstructUsing(
name => new TestService());
s.WhenStarted(ts => ts.Start()); s.WhenStopped(ts => ts.Stop());
});
x.RunAsLocalSystem();
x.SetDescription("Sample test service");
x.SetDisplayName("Test display name");
x.SetServiceName("Test service name");
}));
}
显然,启动应用程序的工作是在自己的任务中运行的。 有更好的方法吗?你能看到这个问题吗?
我的想法是,一旦服务启动,它将从此处理它的自我。
我唯一的想法是:如果你多次重启web应用程序,但我想我可以放入一些逻辑来检查服务是否已经运行,然后再启动另一个。
答案 0 :(得分:2)
您可以使用Quartz执行此操作,而无需担心
答案 1 :(得分:2)
这有效,但这使得服务在Web应用程序的范围内(在IIS内部管理) - 您实际上并不是将其安装为Windows服务。这意味着如果应用程序池丢失,那么您的服务也会丢失。
如果您想将服务安装为Windows服务,则需要检查它是否存在,然后在控制台应用程序中运行“servicename install start”。这真的取决于你想要什么。将它作为应用程序的一部分可能会给你一些东西,但如果你需要在多台机器上运行应用程序,它可能会很尴尬。
就个人而言,我总是将它作为一个单独的服务运行,而不是在IIS内部的Web应用程序范围内运行。