1

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

4

2 回答 2

2

这行得通,但这使服务存在于 Web 应用程序的范围内(在 IIS 内管理) - 您并没有真正将其安装为 Windows 服务。这意味着如果应用程序池下降,您的服务也会下降。

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

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

于 2011-10-18T16:29:15.150 回答
2

你也可以用Quartz做到这一点而无需担心

于 2011-10-18T13:13:57.653 回答