这是要点:
我想在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
将导致请求触发,但同样,我不想等待一秒钟。
有什么想法吗?
答案 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对象 - 这应该给它足够的时间在销毁之前触发请求。