今天,我们已经构建了一个控制台应用程序,用于运行我们的ASP计划任务。网的网站。但是我认为这种方法容易出错,而且很难维护。如何执行计划任务(在windows/IIS/ASP。网络环境)

更新:

任务示例:

从数据库中的电子邮件队列发送电子邮件 从数据库中删除过时的对象 从谷歌AdWords检索统计数据,并在数据库中填充一个表。


当前回答

我发现这对所有参与者来说都很简单:

创建一个webservice方法,如DoSuchAndSuchProcess 创建一个控制台应用程序来调用这个webmethod。 在任务调度程序中调度控制台应用程序。

使用这种方法,所有的业务逻辑都包含在你的web应用程序中,但你有windows任务管理器的可靠性,或任何其他商业任务管理器来启动它并记录任何返回信息,如执行报告。使用web服务而不是发布到页面有一点优势,因为它更容易从web服务获取返回数据。

其他回答

我发现这对所有参与者来说都很简单:

创建一个webservice方法,如DoSuchAndSuchProcess 创建一个控制台应用程序来调用这个webmethod。 在任务调度程序中调度控制台应用程序。

使用这种方法,所有的业务逻辑都包含在你的web应用程序中,但你有windows任务管理器的可靠性,或任何其他商业任务管理器来启动它并记录任何返回信息,如执行报告。使用web服务而不是发布到页面有一点优势,因为它更容易从web服务获取返回数据。

All of my tasks (which need to be scheduled) for a website are kept within the website and called from a special page. I then wrote a simple Windows service which calls this page every so often. Once the page runs it returns a value. If I know there is more work to be done, I run the page again, right away, otherwise I run it in a little while. This has worked really well for me and keeps all my task logic with the web code. Before writing the simple Windows service, I used Windows scheduler to call the page every x minutes.

另一种方便的运行方法是使用像Pingdom这样的监视服务。将他们的http检查指向运行您的服务代码的页面。让页面返回结果,然后可以使用该结果触发Pingdom,在出现问题时发送警报消息。

如果你拥有服务器,你应该使用windows任务调度程序。使用AT /?从命令行查看选项。

否则,在基于web的环境中,您可能不得不做一些讨厌的事情,比如设置一台不同的机器,以定时间隔向某个页面发出请求。

为什么要重新发明轮子,使用Threading和Timer类。

    protected void Application_Start()
    {
        Thread thread = new Thread(new ThreadStart(ThreadFunc));
        thread.IsBackground = true;
        thread.Name = "ThreadFunc";
        thread.Start();
    }

    protected void ThreadFunc()
    {
        System.Timers.Timer t = new System.Timers.Timer();
        t.Elapsed += new System.Timers.ElapsedEventHandler(TimerWorker);
        t.Interval = 10000;
        t.Enabled = true;
        t.AutoReset = true;
        t.Start();
    }

    protected void TimerWorker(object sender, System.Timers.ElapsedEventArgs e)
    {
        //work args
    }

还有另一种方法:

1)创建一个“心跳”web脚本,负责在任务到期或过期时启动任务。

2)在某个地方创建一个预定的进程(最好是在同一个web服务器上),它会命中webscript,并强制它以定期的时间间隔运行。(例如,windows调度任务,使用IE或其他工具悄悄启动热节拍脚本)

任务代码包含在web脚本中的事实纯粹是为了将代码保持在web应用程序代码库中(假设两者相互依赖),这对web开发人员来说更容易管理。

另一种方法是创建一个可执行的服务器脚本/程序,它自己执行所有的计划工作,并将可执行文件本身作为计划任务运行。这可以实现web应用程序和计划任务之间的基本解耦。因此,如果你需要在web应用程序/数据库可能关闭或无法访问的情况下运行计划任务,你应该使用这种方法。