我有一个从经典 asp 页面调用的长时间运行的 vb6 Com 对象
当没有太多事情要做时,它工作得很好,但如果必须做很多事情,它就会超时。
有没有办法将其称为异步,这样它就不会超时或
我可以调用进度条来继续刷新客户端,这样就不会超时吗?
Set objQReport = Server.CreateObject("ReportGenerator")
mainRpt = objQReport.GenerateReport(MySessionRef) ' times out here sometimes
Set objQReport = nothing
任何提示都会有帮助
最佳答案
Web 技术并不真正适合长时间运行的任务,但您有多种选择:
一种选择是对第二个 ASP 页面进行 AJAX 调用。一旦 ASP 运行,服务器就会完成该过程,即使客户端(执行实际调用的浏览器/AJAX)不再连接。
此方法确实使用网络技术来处理长时间运行的任务,其缺点是执行此长时间运行的任务会加重 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 中使用它。队列将存储消息并将它们传递给消费者。 Consumer是你需要自己写的;可以读取队列并处理其中的消息的应用程序。
您所做的就是让 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
希望这有帮助,
埃里克
关于com - 在经典 asp 中调用长时间运行的 vb6 com 对象..超时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16570049/