Сегодня мы создали консольное приложение для запуска запланированных задач для нашего веб-сайта ASP.NET. Но я думаю, что этот подход немного подвержен ошибкам и его трудно поддерживать. Как выполнить запланированное задание (в среде Windows / IIS / ASP.NET)
Обновить:
Примеры задач:
- Отправка электронной почты из почтовой очереди в базе данных
- Удаление устаревших объектов из базы данных
- Получение статистики из Google AdWords и заполнение таблицы в базе данных.
asp.net
windows
iis
scheduled-tasks
Нильс Босма
источник
источник
Ответы:
Все мои задачи (которые должны быть запланированы) для веб-сайта хранятся на веб-сайте и вызываются со специальной страницы. Затем я написал простой сервис Windows, который вызывает эту страницу очень часто. Когда страница запускается, она возвращает значение. Если я знаю, что нужно проделать еще больше работы, я сразу же запускаю страницу, в противном случае я запускаю ее через некоторое время. Это сработало очень хорошо для меня и сохраняет всю мою логику задач с веб-кодом. Перед написанием простой службы Windows я использовал планировщик Windows для вызова страницы каждые х минут.
Другой удобный способ запустить это - использовать сервис мониторинга, такой как Pingdom . Направьте их проверку http на страницу, которая запускает ваш сервисный код. Попросите страницу вернуть результаты, которые затем можно использовать для запуска Pingdom для отправки предупреждений, когда что-то не так.
источник
Эта техника Джеффа Этвуда для Stackoverflow - самый простой метод, с которым я столкнулся. Он опирается на механизм обратного вызова «элемент кэша удален», встроенный в систему кэширования ASP.NET.
Обновление: Stackoverflow перерос этот метод. Он работает только во время работы сайта, но это очень простая техника, которая полезна для многих людей.
Также проверьте Quartz.NET
источник
No, we’ve switched to a dedicated task. We definitely outgrew this technique. I do think it’s fine for small sites though!
- Джефф ЭтвудСоздайте пользовательскую службу Windows .
У меня были некоторые критически важные задачи, настроенные как запланированные консольные приложения, и мне было трудно их поддерживать. Я создал службу Windows с «пульсом», который проверял расписание в моей БД каждые пару минут. Это сработало очень хорошо.
Сказав это, я все еще использую запланированные консольные приложения для большинства моих некритических задач обслуживания. Если это не сломано, не исправляйте это.
источник
Я обнаружил, что это легко для всех участников:
Используя эту методологию, вся бизнес-логика содержится в вашем веб-приложении, но у вас есть надежный диспетчер задач Windows или любой другой коммерческий диспетчер задач, чтобы запустить его и записать любую возвращаемую информацию, такую как отчет об исполнении. Использование веб-службы вместо публикации на странице имеет некоторое преимущество, поскольку легче получить данные возврата из веб-службы.
источник
Зачем изобретать велосипед, используйте классы Threading и Timer.
источник
Используйте планировщик Windows для запуска веб-страницы.
Чтобы запретить запуск вредоносного пользователя или паука поисковой системы, при настройке запланированного задания просто вызовите веб-страницу со строкой запроса, например: mypage.aspx? From = scheduletask
Затем при загрузке страницы просто используйте условие: if (Request.Querystring ["from"] == "scheduletask") {// executetask}
Таким образом, ни один поисковик или злоумышленник не сможет выполнить запланированное задание.
источник
Request.IsLocal
>> Только сам сервер может выполнять запланированные задачи, никто другой.Эта библиотека работает как шарм http://www.codeproject.com/KB/cs/tsnewlib.aspx
Это позволяет вам управлять запланированными задачами Windows напрямую через код .NET.
источник
Кроме того, если ваше приложение использует SQL SERVER, вы можете использовать агент SQL для планирования ваших задач. Именно здесь мы обычно размещаем повторяющийся код, управляемый данными (напоминания по электронной почте, плановое обслуживание, чистки и т. Д.). Отличная функция, встроенная в агент SQL, - это параметры уведомлений об ошибках, которые могут предупредить вас в случае сбоя критической задачи.
источник
Я не уверен, какие запланированные задания вы имеете в виду. Если вы имеете в виду такие вещи, как задачи «каждый час, обновите foo.xml», то используйте систему запланированных задач Windows. (Команда «at» или через контроллер.) Пусть он запустит консольное приложение или запросит специальную страницу, которая запускает процесс.
Изменить: я должен добавить, что это нормально, чтобы ваше приложение IIS работало в запланированные моменты тоже. Итак, предположим, что вы хотите проверять свою БД каждые 30 минут и отправлять пользователям по электронной почте напоминания о некоторых данных, вы можете использовать запланированные задачи для запроса этой страницы и, следовательно, получать IIS-обработку.
Если ваши потребности более сложны, вы можете рассмотреть возможность создания службы Windows и ее запуска в цикле для выполнения любой необходимой обработки. Это также имеет преимущество отделения кода для масштабирования или управления. С другой стороны, вам нужно иметь дело со службами Windows.
источник
Если у вас есть сервер, вы должны использовать планировщик задач Windows. Использовать AT /? из командной строки, чтобы увидеть варианты.
В противном случае из веб-среды вам может потребоваться сделать что-то неприятное, например настроить другой компьютер для отправки запросов на определенную страницу через определенный промежуток времени.
источник
Я успешно использовал Abidar в проекте ASP.NET (вот некоторая справочная информация ).
Единственная проблема этого метода заключается в том, что задачи не будут выполняться, если веб-приложение ASP.NET выгружено из памяти (т. Е. Из-за низкого уровня использования). Одна вещь, которую я попробовал, - это создание задачи для запуска веб-приложения каждые 5 минут с сохранением его работоспособности, но это не сработало надежно, поэтому теперь я использую планировщик Windows и базовое консольное приложение для этого.
Идеальным решением является создание службы Windows, хотя это может оказаться невозможным (т. Е. Если вы используете среду общего хостинга). Кроме того, с точки зрения обслуживания становится немного легче держать вещи в веб-приложении.
источник
Вот еще один способ:
1) Создайте веб-скрипт «heartbeat», который отвечает за запуск задач, если они являются DUE или запоздалыми для запуска.
2) Создайте запланированный процесс где-нибудь (предпочтительно на том же веб-сервере), который обращается к веб-сценарию и заставляет его запускаться через регулярные промежутки времени. (например, задача расписания Windows, которая тихо запускает скрипт Heatbeat, используя IE или whathaveyou)
Тот факт, что код задачи содержится в веб-скрипте, предназначен исключительно для хранения кода в кодовой базе веб-приложения (предполагается, что оба они зависят друг от друга), что было бы проще для веб-разработчиков. ,
Альтернативный подход заключается в создании исполняемого сценария / программы сервера, который выполняет всю работу по расписанию самостоятельно и запускает сам исполняемый файл как запланированную задачу. Это может обеспечить фундаментальное разделение между веб-приложением и запланированной задачей. Следовательно, если вам нужно, чтобы запланированные задачи выполнялись даже в том случае, если веб-приложение / база данных не работает или недоступны, вам следует придерживаться этого подхода.
источник
Вы можете легко создать службу Windows, которая выполняет код с интервалом, используя метод ThreadPool.RegisterWaitForSingleObject. Это действительно гладко и довольно легко настроить. Этот метод является более рациональным, чем использование любого из таймеров в платформе.
Посмотрите на ссылку ниже для получения дополнительной информации:
Запуск периодического процесса в .NET с помощью службы Windows:
http://allen-conway-dotnet.blogspot.com/2009/12/running-periodic-process-in-net-using.html
источник
Мы также используем консольные приложения. Если вы используете средства регистрации, такие как Log4net, вы можете правильно контролировать их выполнение. Кроме того, я не уверен, что их сложнее поддерживать, чем веб-страницы, учитывая, что вы можете делиться некоторыми из одних и тех же библиотек кода между ними, если они спроектированы правильно.
Если вы не хотите, чтобы эти задачи выполнялись по времени, у вас может быть веб-страница в административном разделе вашего сайта, которая действует как очередь. Пользователь помещает запрос на выполнение задачи, он, в свою очередь, вставляет пустую запись даты в таблицу MyProcessQueue, и ваша запланированная задача проверяет каждые X минут новую запись в MyProcessQueue. Таким образом, он запускается только тогда, когда клиент хочет, чтобы он работал.
Надеюсь, что эти предложения помогут.
источник
Один из вариантов - настроить службу Windows и заставить ее вызывать запланированное задание.
В winforms я использовал таймеры, не думаю, что это будет хорошо работать в ASP.NET
источник
Новая библиотека классов планировщика заданий для .NET
Примечание. С момента создания этой библиотеки Microsoft представила новый планировщик задач (Task Scheduler 2.0) для Windows Vista. Эта библиотека является оболочкой для интерфейса Task Scheduler 1.0, который все еще доступен в Vista и совместим с Windows XP, Windows Server 2003 и Windows 2000.
http://www.codeproject.com/KB/cs/tsnewlib.aspx
источник