在MVC Web应用程序上运行TopShelf

时间:2011-10-18 10:16:55

标签: model-view-controller topshelf

我需要为我正在构建的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应用程序,但我想我可以放入一些逻辑来检查服务是否已经运行,然后再启动另一个。

2 个答案:

答案 0 :(得分:2)

您可以使用Quartz执行此操作,而无需担心

答案 1 :(得分:2)

这有效,但这使得服务在Web应用程序的范围内(在IIS内部管理) - 您实际上并不是将其安装为Windows服务。这意味着如果应用程序池丢失,那么您的服务也会丢失。

如果您想将服务安装为Windows服务,则需要检查它是否存在,然后在控制台应用程序中运行“servicename install start”。这真的取决于你想要什么。将它作为应用程序的一部分可能会给你一些东西,但如果你需要在多台机器上运行应用程序,它可能会很尴尬。

就个人而言,我总是将它作为一个单独的服务运行,而不是在IIS内部的Web应用程序范围内运行。