我已经破解了一个修复程序,用于在我的网络服务器上运行预定作业,到目前为止已经运行良好。
我需要在IIS 7上每隔x
分钟运行一次作业。为此,我创建了一个网页(runcronjob.aspx),其中包含我要运行的所有逻辑,检查数据库中的作业时间,上次运行时间,发送电子邮件,查询活动目录等。然后我使用了Task Scheduler在我的工作站(不是网络服务器)上调用我制作的页面。我不再拥有一个永远在网络上的专用工作站,所以我想将计划任务移到Web服务器上,这就是我遇到的问题。
Web服务器是运行IIS 7的Windows 2008 x64计算机。我尝试在Web服务器上创建计划任务,就像在本地计算机上一样,但它不起作用。计划任务使用网页作为参数“http://mydomain.com/cron/runcronjob.aspx”调用IEXPLORE.EXE
。当IE 7在Web服务器上启动时,它会提示输入用户名和密码。我还尝试在服务器上本地运行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 secton后面的代码中:
If Request.ServerVariables("LOCAL_ADDR") = Request.ServerVariables("REMOTE_ADDR") Then
FormsAuthentication.RedirectFromLoginPage("AD-ENT\accountToRunAs", False)
End If
登录页面执行代码,但它永远不会重定向回runcronjob.aspx以运行该代码。
我开始没有想法了。
修改 我之所以采用这种'hacky'方法,是因为我对Web服务器的访问权限非常有限,就像是在获得允许我在服务器上运行计划任务的许可。话虽这么说,创建控制台应用程序或运行Windows服务等选项可能会很困难。
答案 0 :(得分:3)
如果您所做的只是数据库维护,那么您的计划任务根本不需要访问Web应用程序。
创建一个执行必要数据库工作的控制台应用程序,并使用计划任务以指定的时间间隔运行控制台应用程序。
修改强>
“创建控制台应用程序或运行Windows服务等选项可能会很困难”
如果无法使用控制台应用程序,请使用计划任务运行更新数据库的脚本。这里的要点是,无论您选择哪种解决方案,都应该直接访问数据库,而不是使用Web应用程序与数据库进行交互。
修改强>
“它不仅仅是使用数据库。它还发送电子邮件,使用Active Directory执行某些操作 - 而不仅仅是数据库操作。”
您还可以使用脚本执行其他操作,例如发送电子邮件,更新活动目录等。
答案 1 :(得分:1)
不幸的是,它需要这样的黑客来使用IIS而不是Windows服务进行调度......但我过去发现的最佳答案仍然是这个:
http://www.codeproject.com/KB/aspnet/ASPNETService.aspx
至于处理身份验证 - 您可以在IIS网站中公开AuthenticationService,然后使用来自身份验证服务的响应将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
答案 2 :(得分:-1)
您应该尝试将所有逻辑移动到控制台应用程序并将其置于无限循环中。
一旦变得稳定,你应该将它重写为Windows服务,并将其设置为启动Windows(即无需登录)。