Есть ли способ выполнять процесс каждый день в веб-приложении .NET, не пишущий сервис окон или задания SQL-сервера

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

Мы выбрали его по следующим причинам:

  • Простая конфигурация / реконфигурирование на различных средах
  • Большое количество предварительно созданного appenders
  • Одному из CMS, который мы используем уже, создали его в
  • Хорошее количество уровней журнала и конфигураций вокруг них

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

, я вижу некоторые достоинства в использовании Трассировки, которая находится в платформе.NET, но я не полностью продаюсь на нем, главным образом потому что компоненты, с которыми я работаю, действительно не делают никаких вызовов Трассировки. Единственная вещь, которую я часто использую, который делает, System.Net.Mail от того, что я могу сказать.

, Таким образом, у нас есть библиотека, которая переносит log4net и в рамках нашего кода, который мы просто должны наполнить как это:

Logger.Instance.Warn("Something to warn about");
Logger.Instance.Fatal("Something went bad!", new Exception());

try {
  var i = int.Parse("Hello World");
} catch(FormatException, ex) {
  Logger.Instance.Error(ex);
}

В рамках методов мы делаем проверку, чтобы видеть, включен ли регистрирующийся уровень, таким образом, у Вас нет избыточных вызовов к log4net API (поэтому, если Отладка не включена, операторы отладки проигнорированы), но когда я получу некоторое время, я буду обновлять его для представления их так, чтобы можно было сделать проверки сами. Это предотвратит оценки, предпринимаемые, когда они не были должны, например:

Logger.Instance.Debug(string.Format("Something to debug at {0}", DateTime.Now);

Это станет:

if(Logger.DebugEnabled) Logger.Instance.Debug(string.Format("Something to debug at {0}", DateTime.Now);

(Экономят немного времени выполнения)

По умолчанию мы регистрируемся в двух местах:

  1. Файловая система веб-сайта (в неподаваемом расширении файла)
  2. электронная почта, посылающая за Ошибкой & Фатальный

Файлы сделаны как прокрутка каждого дня или 10 МБ (IIRC). Мы не используем EventLog, поскольку он может потребовать повышения уровня защиты, чем мы часто хотим дать сайт.

я нахожу, что Блокнот работает просто великолепно для чтения журналов.

12
задан Kalpak 8 September 2009 в 06:53
поделиться

8 ответов

Вы можете попробовать метод, описанный здесь , используемый в самом StackOverflow (или, по крайней мере, он использовался здесь когда-то). Вкратце:

  1. При запуске добавьте элемент в HttpRuntime.Cache с фиксированным истечение срока.
  2. По истечении срока действия элемента кеша выполните свою работу, например WebRequest или что-нибудь вы.
  3. Повторно добавьте элемент в кеш с фиксированным сроком действия.

Чтобы заставить его запускаться в определенное время вместо интервала, вы можете уменьшить интервал и просто изменить свой метод работы, чтобы проверить время


Как отмечается в комментариях к исходной статье, приведенной выше, это не идеальное решение, и никто не должен предпочесть его правильному методу планирования, если он доступен. См. Когда Asp.Net удаляет просроченные элементы кэша? для некоторых дополнительных требований.

12
ответ дан 26 October 2019 в 10:45
поделиться

К сожалению, это невозможно.

IIS отвечает только на запросы, а SQL Server просыпается только для выполнения заданий.

Ближайшее, что вы сможете сделать, это выполнить поместите свою процедуру на страницу ASPX, не связанную с сайтом и не имеющую очевидного имени, и активируйте ее по запросу с какой-либо другой машины в Интернете.

Другой машиной может быть Windows, Linux, Mac, все, что у вас есть, и на всех этих платформах есть способы планирования событий (службы, cron и т. д.), которые могут сделать запрос на запуск обновления на сервере.

1
ответ дан 26 October 2019 в 10:45
поделиться

Да, использовать планировщик Windows. В зависимости от того, как он настроен, вам может потребоваться войти в систему для запуска планировщика.

3
ответ дан 26 October 2019 в 10:45
поделиться

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

Вы можете настроить веб-службу или страницу на своем веб-сайте, чтобы запустить процесс, а затем получить запланированная задача на настольном компьютере запускает эту страницу / службу один раз в день, чтобы запустить процесс. Хакерский, но может сработать.

0
ответ дан 26 October 2019 в 10:45
поделиться

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

http://weblogs.asp.net/jgalloway/archive/2005/10/24/428303.aspx

Планировщик запускал бы файл VBS со следующими параметрами ..

Set oServerXML = CreateObject("Msxml2.ServerXMLHTTP")
oServerXML.Open "GET","http://my.hostedservice.com/myService.asmx/myService?aParam=Value
oServerXML.setRequestHeader "Content-Type","application/x-www-form-urlencoded" 
oServerXML.Send
Set oServerXML = nothing
2
ответ дан 26 October 2019 в 10:45
поделиться

Поскольку .NET не осведомлен, я мог бы предположить, что для этого существует какая-то платформа планировщика на основе .NET (очень похожая на Quartz для Java).

Или вы можете просто запустить долгую работу поток, который большую часть времени проводит в спящем режиме, просыпается каждую минуту, проверяет время, проверяет свой список «дел, которые нужно сделать», запускает те, которые необходимо сделать. Уровень сложности настолько велик, насколько вы хотите, но основная цель - поддерживать основной поток планирования «живой», «любой ценой».

0
ответ дан 26 October 2019 в 10:45
поделиться

Есть способы запускать «службы» в .Net, используя истечение срока действия кеша для запуска задачи.

Подробнее на CodeProject

1
ответ дан 26 October 2019 в 10:45
поделиться

Теперь я могу думать о следующем:

  • Создайте dll, содержащую запланировать логику, которую вы хотите, и сделать убедитесь, что эта функция расписания dll не остановится и будет зацикливаться вечно, тогда вам понадобится страница об этом сервер эта страница запустит эту dll функции. "вам нужно будет позвонить эту страницу хотя бы один раз, чтобы запустить scheduler ".

  • Создайте приложение," хранящее логику расписания "на другом компьютере, может быть на вашем домашнем ПК, и заставьте приложение вашего ПК вызывать функции на сервере через веб-службы или страницы

0
ответ дан 26 October 2019 в 10:45
поделиться
Другие вопросы по тегам:

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