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

更新:

任务示例:

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


当前回答

我不确定你指的是哪种计划任务。如果你的意思是“每小时刷新foo.xml”类型的任务,那么使用Windows的计划任务系统。(通过“at”命令,或者通过控制器。)让它运行一个控制台应用程序,或者请求一个特殊的页面来启动这个过程。

编辑:我应该补充,这是一个好的方式,让你的IIS应用程序运行在预定的点。因此,假设您希望每30分钟检查一次数据库,并通过电子邮件提醒用户一些数据,您可以使用计划任务来请求这个页面,从而让IIS处理事情。

如果你的需求更复杂,你可以考虑创建一个Windows服务,并让它运行一个循环来做你需要的任何处理。这样做还有一个好处,就是可以将代码分离出来用于扩展或管理目的。缺点是,您需要处理Windows服务。

其他回答

我已经成功地在ASP中使用了Abidar。NET项目(这里有一些背景信息)。

此方法的唯一问题是,如果ASP。NET web应用程序从内存中卸载。由于使用率低)。我尝试过的一件事是创建一个任务,每5分钟访问一次web应用程序,让它保持活跃,但这似乎并不可靠,所以现在我使用Windows调度器和基本的控制台应用程序来做这件事。

理想的解决方案是创建一个Windows服务,尽管这可能是不可能的。如果您正在使用共享托管环境)。从维护的角度来看,这也使得在web应用程序中保持内容更容易一些。

还有另一种方法:

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

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

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

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

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

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

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

此外,如果你的应用程序使用SQL SERVER,你可以使用SQL代理来安排你的任务。这是我们通常放置重复出现的数据驱动代码(电子邮件提醒、定期维护、清洗等)的地方。SQL Agent内置的一个很好的特性是失败通知选项,它可以在关键任务失败时提醒您。

Jeff Atwood为Stackoverflow开发的这个技术是我遇到过的最简单的方法。它依赖于ASP中内置的“缓存项删除”回调机制。NET的缓存系统

更新:Stackoverflow已经超越了这种方法。它只在网站运行时起作用,但这是一个非常简单的技术,对许多人都有用。

也可以看看Quartz。网