Web 技术并不真正适合长时间运行的任务,但您有多种选择:
一种选择是对第二个 ASP 页面进行 AJAX 调用。只要您运行 ASP,服务器就会完成该过程,即使客户端(进行实际调用的浏览器/AJAX)不再连接。
这种方法确实使用 Web 技术来处理一个长时间运行的任务,缺点是执行这个长时间运行的任务会加重 IIS 机器的负担,从而降低 IIS 擅长的性能;服务网页。
因此,在您的登录页面(例如 default.asp)中,对您的(长期运行的)报告页面进行 AJAX 调用。如何进行 ajax 调用取决于您使用的(如果有的话)javascript 库。在 Jquery 中会是这样的:
<script type="text/javascript">
/* AJAX call to start the report generation */
$(document).ready(function(){
$.get("[URL_OF_YOUR_LONG_RUNNING_PROCESS]", function(data)
{
alert(data);
});
});
</script>
如您所见,我正在警告从此 URL 返回的任何数据,但在您的情况下,这可能不是您想要的。您希望您的访问者在长期运行的过程继续工作时继续浏览。
这样,URL 被异步调用。服务器将开始处理 URL,浏览器无需等待。服务器将继续并在后台完成长时间运行的任务。
请注意,您仍然需要在运行长进程的 asp 页面上增加 server.scripttimeout。这只是确保用户可以继续浏览,服务器仍然会尊重配置的 server.scripttimeout 设置,如果时间过长则会失败。
广泛使用的第二种选择是使用消息队列。消息队列接受消息并保证这些消息的传递,即使计算机或网络出现故障也是如此。
Microsoft Windows 内置了 MSMQ(您必须在软件设置中启用它),您可以在经典 ASP 中使用它。队列将存储消息并将它们传递给消费者。消费者是你需要自己写的东西;一个可以读取队列并处理内部消息的应用程序。
您所做的是让 ASP 向 MSMQ 写入一条消息,其中包含有关要执行的任务及其参数的信息。
您的消费者应用程序必须轮询 MSMQ、读取消息并启动长时间运行的进程。这将完全独立于 IIS 运行,甚至可以在完全不同的计算机上运行(MSMQ 可以跨网络运行)。
第二种方法的缺点是您必须编写一个消费者,很可能使用更底层的语言,如 VB 或 C#(尽管您可能能够使用 Python),并且最好将其编写为服务。我不知道您在使用这些语言(其中一种)时有多舒服,但是如果您自己编写 COM 对象,那么在 VB6 中编写一个轮询 MSMQ 并调用 COM 对象的可执行文件将是微不足道的。以下是一些帮助您入门的链接。
http://support.microsoft.com/kb/173339
http://technosock.blogspot.nl/2007/07/microsoft-message-queue-from-classical.html
http://www.informit.com/articles/article.aspx?p=131272&seqNum=6
希望这可以帮助,
埃里克