запуск TopShelf в веб-приложении MVC - PullRequest
1 голос
/ 18 октября 2011

Мне нужно выполнить некоторые фоновые задачи для веб-приложения, которое я создаю.Мне нравится внешний вид использования 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");
                                                        }));
    }

очевидно, что задача запуска приложения запускается сама по себезадача.Есть ли лучшие способы сделать это?Не могли бы вы увидеть проблему с этим?

Моя идея состоит в том, что, как только служба будет запущена, она с этого момента будет обрабатывать себя.

Моя единственная мысль была: если вы перезапустите свое веб-приложениенесколько раз, но я подумал, что мог бы просто добавить логику, чтобы проверить, что если служба уже запущена, не запускайте другую.

Ответы [ 2 ]

2 голосов
/ 18 октября 2011

Это работает, но это делает службу доступной в рамках веб-приложения (управляется внутри IIS) - вы на самом деле не устанавливаете его как службу Windows. Это означает, что если пул приложений падает, то же самое происходит и с вашим сервисом.

Если вы хотите установить службу как службу Windows, вам необходимо проверить ее существование, а затем запустить «запуск установки servicename» в консоли приложения. Это действительно зависит от того, что вы хотите. Наличие его в приложении может дать вам кое-что, но если вам нужно запустить приложение на нескольких компьютерах, это может быть неудобно.

Лично я всегда заставляю его работать как отдельный сервис, а не в рамках веб-приложения внутри IIS.

2 голосов
/ 18 октября 2011

Вы можете сделать это с помощью Кварц , не беспокоясь тоже

...