如何在asp classic中发出异步调用并忽略响应?

8

以下是要点:

我想在asp中进行一次调用,但我不关心响应。我只想触发调用,而且我不希望页面等待响应。根据文档,代码应该类似于这样:

dim xmlhttp : set xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP")
xmlhttp.Open "POST", url, true '' setting the 'asynchronous' option to 'true'
xmlhttp.setRequestHeader "Content-Type", "application/soap+xml; charset=utf-8"
xmlhttp.setRequestHeader "Content-Length", Len(XMLData)
xmlhttp.send XMLData

当同步调用时,这很完美,但当我将“ansynchronous”选项翻转为“true”时,没有任何反应。从互联网上可以得知,用户会执行以下操作:

While xmlhttp.readyState <> 4
    xmlhttp.waitForResponse 1000
Wend

如果你在等待响应,这似乎不再是异步调用了,难道我疯了吗?

xmlhttp.waitForResponse 1放在发送后面会导致请求被触发,但是我不想等一秒钟。

有什么想法吗?

4个回答

14

今天我遇到了同样的问题。 我通过使用 "Microsoft.XMLHTTP" 对象解决了它。

dim xmlhttp 
set xmlhttp = Server.CreateObject("Microsoft.XMLHTTP")
xmlhttp.Open "POST", url, true 
xmlhttp.Send ""

现在请求是异步发送的,目标URL已被访问。希望能有所帮助。


你刚刚救了我免于用头撞键盘而死。这似乎是“MSXML2.ServerXMLHTTP”的直接替换(无需重构?)-但我将运行回归测试以确保。 - jerhewet

7
关键问题在于,如果您不等待并且您的脚本结束,ServerXMLHTTP组件将销毁自身,并在此过程中中止未完成的请求。您无法保证此时请求的进度。
例如,如果您的服务器尚未开始向目标服务器发出请求,则会看到其不再需要,因此不再继续进行。
即使已经连接到目标服务器,请求也可能还没有被传递给处理程序。通常,Web服务器会在分配资源以满足请求之前检查客户端是否仍然连接。如果它发现您的连接已断开,则不会继续完成请求。
换句话说,在经典 ASP 中,没有可靠的方法来异步执行此操作,因为它不设计处理此类事情。最好的方法是在您的脚本处理其他任务(如果有其他任务要处理)的同时进行其他操作,但是,我甚至不建议这样做,因为在 ASP 内部使用异步 WinHTTP 是不稳定的。

3
我们在ASP网站中使用异步XMLRequest将错误记录到Fogbugz。由于这只是一个错误报告,我们不希望用户等待我们的代码完成,所以我们采用异步方式。这可能是由于缺少配置文件、DB超时、在某个配置文件中缺少查找等原因。并非总是紧急情况,但了解这些对我们很有好处。在这些情况下,异步效果很好,如果不行,对我们也不是世界末日,但我们没有遇到过任何问题。我们一直在使用这个脚本,我们创建并发布在另一个问题中:System.Net.HttpWebRequest in classic asp?
正如Anthony所说,它并不能100%保证通过。作为可能的修复方法,您可以设置Response.Buffer = true,将所有输出呈现给用户,调用Response.Flush,然后进行waitForResponse调用。用户将看到整个页面,并能够与之交互,而没有任何停顿,这给您的异步调用更多的时间来完成。

2
如果您仍想使用ServerXMLHTTP对象(而不是Anton在FAQ#4中提到的客户端组件,请参见http://support.microsoft.com/kb/290761),另一个选择是创建一个VBScript类。实例化该类。将类的属性设置为HTTP对象。然后调用一个方法来触发请求。
永远不要销毁类实例 - 当ASP页面完成时,它将自动销毁。让类销毁方法释放HTTP对象 - 这应该足够时间让它在被销毁之前触发请求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接