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

时间:2009-10-02 16:09:51

标签: asp-classic asynchronous serverxmlhttp

这是要点:

我想在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 个答案:

答案 0 :(得分:12)

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

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

现在请求以异步方式发送,目标网址被点击。 希望有所帮助。

答案 1 :(得分:7)

这里的关键问题是,如果您不等待并且脚本结束,则ServerXMLHTTP组件会自行销毁,并且在此过程中将中止未完成的请求。您无法保证当时请求的位置。

例如,如果您的服务器尚未发送到目标服务器,它将看到它不再需要而且不会打扰。

即使已与目标服务器建立连接,也可能尚未向处理程序提供请求。在提交资源以完成请求之前,Web服务器通常会检查客户端是否仍处于连接状态。如果它看到您的连接已被删除,则无需完成请求。

换句话说,没有可靠的方法在经典ASP中异步执行此操作,它只是不是为处理那种事情而设计的。你可以获得的最好的是在你的脚本继续使用别的东西时做其他事情(如果你还有其他东西可以使用),但是,我甚至不建议这样,因为ASP中的异步WinHTTP是不稳定的。

答案 2 :(得分:3)

我们使用异步XMLRequest将错误记录到我们的ASP站点中的Fogbugz中。作为唯一的错误报告,我们不希望我们的用户等待我们的代码完成,所以我们做异步。这可以是任何东西,从缺少配置文件,数据库超时,在某处的配置文件中缺少查找,等等。不总是任务哭泣的东西,但很高兴知道。在那些情况下,异步是一种享受,如果不是,那么它对我们来说不是世界末日,但我们没有遇到任何问题。我们一直在使用我们在另一个问题中创建和发布的脚本:

System.Net.HttpWebRequest in classic asp?

就像安东尼所说的那样虽然不是百分之百准备通过。作为一种可能的修复,您可以使用Response.Buffer = true,将所有输出呈现给用户,调用Response.Flush,然后执行waitForResponse调用。用户将看到整个页面,并且能够在没有任何阻碍的情况下与其进行交互,并且它为您的异步调用提供了更多的时间来完成。

答案 3 :(得分:2)

如果您仍想使用ServerXMLHTTP对象(而不是Anton上面提到的客户端组件,请参阅http://support.microsoft.com/kb/290761上的FAQ#4),另一个选择是创建VBScript类。实例化该类。将类的属性设置为HTTP对象。然后调用一个方法来触发请求。

不要销毁类实例 - 它会在ASP页面完成时自动销毁。让类破坏方法释放HTTP对象 - 这应该给它足够的时间在销毁之前触发请求。