Какая альтернатива мне для запуска запланированного задания? - PullRequest
1 голос
/ 15 сентября 2011

Я собрал исправление для запуска запланированного задания на моем веб-сервере, которое до сих пор работало достаточно хорошо.

Мне нужно было запускать работу каждые x минуты на моем компьютере с IIS 7. Для этого я создал веб-страницу (runcronjob.aspx), которая содержит всю логику, которую я хочу запустить, проверяет время выполнения заданий в базе данных, время последнего выполнения, отправку электронной почты, запрос активного каталога и т. Д. Затем я использовал планировщик заданий. на моей рабочей станции (не веб-сервер), чтобы вызвать страницу, которую я сделал. У меня больше нет выделенной рабочей станции, которая всегда будет в сети, поэтому я бы хотел перенести запланированное задание на веб-сервер, и именно здесь я застреваю.

Веб-сервер представляет собой компьютер под управлением Windows 2008 x64 с IIS 7. Я попытался создать запланированное задание на веб-сервере так же, как на локальной машине, но он не работает. Запланированная задача вызывает IEXPLORE.EXE с веб-страницей в качестве параметра "http://mydomain.com/cron/runcronjob.aspx".. Когда IE 7 запускается на веб-сервере, он запрашивает имя пользователя и пароль. Я также попытался запустить скрипт vbs локально на сервере:

runjob.vbs

Call LogEntry()

Sub LogEntry()

        'Force the script to finish on an error.
        On Error Resume Next

        'Declare variables
        Dim objRequest
        Dim URL

        Set objRequest = CreateObject("Microsoft.XMLHTTP")

        'Put together the URL link appending the Variables.
        URL = "http://mydomain.com/cron/runcronjob.aspx"

        'Open the HTTP request and pass the URL to the objRequest object
        objRequest.open "GET", URL , false

        'Send the HTML Request
        objRequest.Send

        'Set the object to nothing
        Set objRequest = Nothing

End Sub

Проблема, с которой я столкнулся в этом сценарии, заключается в том, что у меня есть настройка проверки подлинности форм на веб-сайте. Поэтому, когда этот скрипт запускается, он перенаправляет на страницу входа в систему вместо запуска кода в runcronjob.aspx. Чтобы обойти это, я добавил этот код в код за разделом Page_Load страницы входа в систему:

If Request.ServerVariables("LOCAL_ADDR") = Request.ServerVariables("REMOTE_ADDR") Then
    FormsAuthentication.RedirectFromLoginPage("AD-ENT\accountToRunAs", False)
End If

Страница входа в систему выполняет код, но никогда не перенаправляется обратно в runcronjob.aspx для запуска этого кода.

У меня заканчиваются идеи.

EDIT: Причина, по которой я делаю это таким «хакерским» методом, заключается в том, что у меня очень ограниченный доступ к веб-серверу, и это было все равно что выдергивать зубы, даже получая разрешение на запуск запланированной задачи на сервере. При этом такие варианты, как создание консольного приложения или службы Windows для запуска, могут оказаться затруднительными.

Ответы [ 3 ]

3 голосов
/ 15 сентября 2011

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

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

РЕДАКТИРОВАТЬ

"такие параметры, как создание консольного приложения или запуска службы Windows, могут оказаться трудными"

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

EDIT

«Это больше, чем просто работа с базой данных. Он также рассылает электронные письма, что-то делает с Active Directory, а не только действия с базой данных».

Вы также можете использовать сценариивыполнять другие действия, такие как отправка электронных писем, обновление активной директории и т. д.

1 голос
/ 15 сентября 2011

К сожалению, требуется такой взлом, чтобы использовать IIS, а не Windows Service для планирования ... но лучший ответ, который я нашел в прошлом, по-прежнему такой:

http://www.codeproject.com/KB/aspnet/ASPNETService.aspx

Что касается обработки аутентификации - вы можете предоставить AuthenticationService на своем веб-сайте IIS, а затем использовать wininet для SetCookie, используя ответ от службы аутентификации ..., который сделает ваш запрос GET успешным без перенаправления на страницу входа.., Ссылки:

http://msdn.microsoft.com/en-us/library/aa385326(v=vs.85).aspx

http://msdn.microsoft.com/en-us/library/system.web.applicationservices.authenticationservice.aspx

0 голосов
/ 15 сентября 2011

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

Как только это станет стабильным, вы должны переписать его как службу Windows и настроить запуск с помощью Windows (т.е. без входа в систему).

...