com - 在经典 asp 中调用长时间运行的 vb6 com 对象..超时错误

标签 com asp-classic vb6

我有一个从经典 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/

相关文章:

winapi - 如何从隐藏窗口应用程序中显示对话框?

c# - 使用 Microsoft.Office.Interop dll 的单元测试在生成服务器上失败

asp-classic - ASP/GetRows & 计数

scripting - 使用VB代码检测是否安装了adobe reader

audio - 如何通过特定的声卡播放音频?

c++ - native WMI 提供程序中的 UINT64 不会在某些系统上返回数据

c++ - HTML 文件 : add annotations through IHTMLDocument

php - MySQL 连接在 PHP 中有效,但在 ASP 中无效

iis-7 - ASPError 对象在我的自定义错误页面上不包含任何数据

vb6 - 格式化整数