#model-view-controller #topshelf
#model-view-controller #topshelf
Вопрос:
Мне нужно выполнить некоторые фоновые задачи для веб-приложения, которое я создаю. Мне нравится внешний вид использования 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");
}));
}
очевидно, что задача запуска приложения выполняется в его собственной задаче.
Есть ли лучшие способы сделать это? Не могли бы вы увидеть проблему с этим?
Моя идея заключается в том, что после запуска службы с этого момента она будет работать самостоятельно.
Моей единственной мыслью было: если вы перезапускаете свое веб-приложение несколько раз, но я подумал, что могу просто добавить некоторую логику, чтобы проверить, что если служба уже запущена, не запускайте другую.
Ответ №1:
Это работает, но это заставляет службу работать в рамках веб-приложения (управляемого внутри IIS) — на самом деле вы не устанавливаете его как службу Windows. Это означает, что если пул приложений падает, падает и ваша служба.
Если вы хотите установить службу как службу Windows, вам нужно будет проверить ее существование, а затем запустить «servicename install start» с ней внутри консольного приложения. Это действительно зависит от того, что вы хотите. Включение его в приложение может вам что-то дать, но если вам нужно запустить приложение на нескольких компьютерах, это может быть неудобно.
Лично я бы всегда запускал его как отдельную службу, а не в рамках веб-приложения внутри IIS.
Ответ №2:
Вы также можете сделать это с помощью Quartz без каких-либо проблем
Комментарии:
1. 1 В конце концов, я выбрал этот подход, и он сработал. Спасибо.