@rybchenko80
Разработчик на ASP.NET

Как заставить работать сайт на iis без запросов к сайту?

Есть ли способ заставить работать сайт даже если к нему нет запросов? Дело в том, что на сайте есть код который выполняет работу по расписанию с помощью quartz. Но если к сайту нет запросов то и код не выполняется.
  • Вопрос задан
  • 344 просмотра
Пригласить эксперта
Ответы на вопрос 2
@cicatrix
было бы большой ошибкой думать
Обычно регламентные задания на CRON вешаются (или аналог), то есть, это независимая от веб-сервера задача.
Если сайт на своём сервере или VDS - ничего нет проще подвесить задачку выполняться периодически.
Если на хостинге - свяжитесь с ними, у любого хостера наверняка есть подобная услуга (или, во всяком случае, можно договориться)...
Ну если мсье извращенец, то можно на любой другой машине организовать выполнение веб-запроса с заданной периодичностью, но это, повторяю, извращение.
Веб-сервер служит одной цели - ВНЕЗАПНО - обслуживать веб-запросы. Всё остальное он делать не должен (и не предназначен для этого).

UPDATE: Не дочитал - quartz на машине по-нормальному должен хоститься как windows service.
Ответ написан
Комментировать
@basrach
1. Найти файл настроек IIS: %WINDIR%\System32\inetsrv\config\applicationHost.config
2. В этом файле найти секцию applicationPools, найти там нужный appPool, добавить/заменить атрибуты на autoStart="true" startMode="AlwaysRunning", должно быть типа такого:
<applicationPools>
  <add name="DefaultAppPool" autoStart="true" startMode="AlwaysRunning" managedRuntimeVersion="v4.0">

3. Найти секцию sites, в ней нужный site, а там нужный application и добавить туда в тег application два атрибута: serviceAutoStartEnabled="true" serviceAutoStartProvider="ApplicationPreload"
<sites>
    <site name="Default Web Site" id="1" serverAutoStart="true">
        <application path="/" serviceAutoStartEnabled="true" serviceAutoStartProvider="ApplicationPreload"

4. Ниже, прямо после секции sites или перед закрытием тега system.applicationHost добавьте:
<serviceAutoStartProviders>
    <add name="ApplicationPreload" type="MyNamespace.ApplicationPreload, MyAssembly" />
</serviceAutoStartProviders>

Обратите внимание! Значение name должно совпадать с значением serviceAutoStartProvider.
Значением type должно быть полное имя класса-загрузчика (неймспейс, сборка), который будет запускать quartz при старте сайта.
5. Реализовать собственно класс-загрузчик:
public class ApplicationPreload : System.Web.Hosting.IProcessHostPreloadClient
{
    public void Preload(string[] parameters)
    {
        // Qurtz.Net.Start() // или как там хз
    }
}


При этом надо помнить, что пул может быть всё равно "прибит" IIS-ом, например, если исчерпан лимит по памяти. Необработанное исключение в вашем коде может его также остановить. Но после остановки он должен сразу же запускаться. Т.е. нельзя надеяться что некий код будет работать 24/7. Он будет прерываться, но сразу же запускаться.

Также, лучше код запуска qurtz-а (тот что в методе Preload(string[])) повторить в методе Application_Start в Global.asax для надежности.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы