Asp.net 我必须运行计划任务的替代方案是什么

Asp.net 我必须运行计划任务的替代方案是什么,asp.net,iis-7,windows-server-2008,scheduled-tasks,Asp.net,Iis 7,Windows Server 2008,Scheduled Tasks,我已经拼凑了一个补丁,在我的web服务器上运行一个调度作业,到目前为止,它已经运行得很好了 我需要在我的IIS 7设备上每隔x分钟运行一次作业。为了实现这一点,我创建了一个网页(runcronjob.aspx),其中包含我想要运行的所有逻辑,检查数据库中的作业时间、上次运行时间、发送电子邮件、查询active directory等。然后,我使用工作站(而非web服务器)上的任务调度器调用我创建的页面。我不再有一个始终在网络上的专用工作站,因此我想将计划的任务移动到web服务器,这就是我遇到的问题

我已经拼凑了一个补丁,在我的web服务器上运行一个调度作业,到目前为止,它已经运行得很好了

我需要在我的IIS 7设备上每隔
x
分钟运行一次作业。为了实现这一点,我创建了一个网页(runcronjob.aspx),其中包含我想要运行的所有逻辑,检查数据库中的作业时间、上次运行时间、发送电子邮件、查询active directory等。然后,我使用工作站(而非web服务器)上的任务调度器调用我创建的页面。我不再有一个始终在网络上的专用工作站,因此我想将计划的任务移动到web服务器,这就是我遇到的问题

web服务器是运行IIS 7的Windows 2008 x64计算机。我尝试在web服务器上以与在本地计算机上相同的方式创建计划任务,但它不起作用。计划任务调用
IEXPLORE.EXE
,并将网页作为参数“http://mydomain.com/cron/runcronjob.aspx". 当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上运行代码。为了解决这个问题,我将此代码添加到登录页面页面加载部分的代码中:

If Request.ServerVariables("LOCAL_ADDR") = Request.ServerVariables("REMOTE_ADDR") Then
    FormsAuthentication.RedirectFromLoginPage("AD-ENT\accountToRunAs", False)
End If
登录页面执行代码,但它从不重定向回runcronjob.aspx以运行该代码

我开始没有主意了

编辑:
我之所以使用这种“黑客”方法,是因为我对web服务器的访问非常有限,甚至获得允许我在服务器上运行计划任务的权限都是徒劳的。也就是说,创建控制台应用程序或运行Windows服务等选项可能很困难。

您应该尝试将所有逻辑移到控制台应用程序,并将其放入无限while循环中


一旦这变得稳定,您应该将其重写为windows服务,并将其设置为使用windows启动(即不登录)。

不幸的是,使用IIS而不是windows服务进行调度需要这样的黑客手段……但我在过去找到的最佳答案仍然是:

至于处理身份验证-您可以在IIS网站中公开AuthenticationService,然后使用wininet使用来自身份验证服务的响应设置Cookie…这将使GET请求成功,而无需重定向到登录页..,请参考:


如果您所做的只是数据库维护,那么您的计划任务应该根本不需要访问web应用程序

创建执行必要数据库工作的控制台应用程序,并使用计划任务以指定的间隔运行控制台应用程序

编辑

“创建要运行的控制台应用程序或Windows服务等选项可能很困难”

如果不可能使用控制台应用程序,请使用计划任务运行更新数据库的脚本。这里的要点是,无论您选择什么解决方案,都应该直接访问数据库,而不是使用web应用程序与数据库交互

编辑

“它不仅仅处理数据库。它还发送电子邮件,用Active Directory做一些事情,而不仅仅是数据库操作。”


您还可以使用脚本执行其他操作,如发送电子邮件、更新active directory等。

除了打开IE,此计划任务应该做什么?@zeroef,而不是使用Windows任务计划程序调用执行此任务的网页,将作业执行逻辑从asp.net页面移动到一个小型应用程序(如控制台应用程序),并使用windows任务计划程序每隔x分钟调用一次此类应用程序。能否在vbs结束时杀死iexplore.exe?david是对的。使用vb express或pro编写一个简单的控制台应用程序。@Davide和Amit-请参阅我的编辑。我之所以在网页上运行所有逻辑,是因为我知道我将始终有权修改它。我没有web服务器的管理员权限:(好极了,正是我在评论中提出的:)+1是一个很好的建议,但这不是一个可行的选择。为我的问题添加了更多信息。@James-很抱歉在我的原始问题中含糊不清。它不仅仅是处理数据库。它还发送电子邮件,在Active Directory中执行一些操作,而不仅仅是数据库操作。@zeroef:这些都是您可以在脚本中执行的操作。所以可以编写脚本,但不能编写服务?如果服务器重新启动,您会怎么做。只有当有人登录到服务器时,所有计划的任务才会启动。你的网站会出现,所有的后台服务都会启动,这不是真的。有一个设置可以在用户未登录的情况下运行任务。如果你说的是真的,那么预定的任务基本上是无用的。