【问题标题】:What alternative do I have to run a scheduled task我有什么替代方法来运行计划任务
【发布时间】:2011-11-18 04:08:03
【问题描述】:

我已经编写了一个修复程序,用于在我的网络服务器上运行计划的作业,到目前为止它运行良好。

我需要在我的 IIS 7 机器上每 x 分钟运行一次作业。为此,我创建了一个网页 (runcronjob.aspx),其中包含我想要运行的所有逻辑、检查数据库中的作业时间、上次运行时间、发送电子邮件、查询活动目录等。然后我使用了任务计划程序在我的工作站(不是 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 上运行代码。为了解决这个问题,我将此代码添加到登录页面的 Page_Load 部分后面的代码中:

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

登录页面执行代码,但它永远不会重定向回 runcronjob.aspx 以运行该代码。

我的想法开始用完了。

编辑: 我之所以采用这种“hacky”方法是因为我对 Web 服务器的访问权限非常有限,这就像拔牙甚至获得允许我在服务器上运行计划任务的权限。话虽如此,创建控制台应用程序或要运行的 Windows 服务等选项可能会很困难。

【问题讨论】:

  • 除了打开IE,这个定时任务应该做什么?
  • @zeroef,而不是使用 Windows 任务调度程序来调用执行该作业的网页,而是将作业执行的逻辑从该 asp.net 页面移动到一个小型应用程序,如控制台应用程序,并使用 Windows 任务调度程序每隔 x 分钟调用一次此类应用程序。
  • 你能在你的 vbs 结束时杀死 iexplore.exe 吗?
  • 大卫是对的。使用 vb express 或 pro 编写一个简单的控制台应用程序。
  • @Davide 和 Amit - 查看我的编辑。我将所有逻辑都运行在网页上的原因是因为我知道我将始终有权修改它。我在 Web 服务器上没有管理员权限。 :(

标签: asp.net iis-7 windows-server-2008 scheduled-tasks


【解决方案1】:

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

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

编辑

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

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

编辑

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

您还可以使用脚本执行其他操作,例如发送电子邮件、更新活动目录等。

【讨论】:

  • 太棒了,正是我在评论中建议的:)
  • +1 以获得很好的建议,但这不是一个可行的选择。为我的问题添加了更多信息。
  • @James - 抱歉在我原来的问题中含糊不清。它不仅仅与数据库一起工作。它还发送电子邮件,使用 Active Directory 做一些事情——不仅仅是数据库操作。
  • @zeroef:这些都是你可以在脚本中做的事情。
【解决方案2】:

不幸的是,它需要这样的 hack 才能使用 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

【讨论】:

    【解决方案3】:

    您应该尝试将所有逻辑移至控制台应用程序,并将其置于无限 while 循环中。

    一旦它变得稳定,您应该将其重写为 Windows 服务并设置它以 Windows 启动(即无需登录)。

    【讨论】:

    • 所以可以写脚本,但不能写服务?如果服务器重新启动,你会怎么做。只有当有人登录服务器时,所有计划任务才会启动。你的网站会出现,所有后台服务都将启动。
    • 这不是真的。有一个设置可以在没有用户登录的情况下运行任务。如果你说的是真的,计划任务基本上没有用。
    猜你喜欢
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    相关资源
    最近更新 更多