7

这是要点:

我有一个我想用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

这在同步调用时效果很好,但是当我将异步选项翻转为“true”时,什么都不会触发。我可以从互联网上收集到的是用户执行以下操作:

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

如果您正在等待响应,我是否疯了,因为这看起来不再像是一个异步调用?

在发送之后立即放置该行将xmlhttp.waitForResponse 1导致请求触发,但同样,我不想等待一秒钟。

有什么想法吗?

4

4 回答 4

13

Today I got the same issue. I resolved it by using "Microsoft.XMLHTTP" object.

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

And now the request is sent asynchronously and target URL was hit. Hope that helps.

于 2010-08-16T15:37:15.047 回答
7

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

例如,如果您的服务器没有时间向目标服务器发出请求,它将看到它不再需要并且不会打扰。

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

换句话说,在经典的 ASP 中没有可靠的方法来异步执行此操作,它只是不是为处理这类事情而设计的。你能得到的最好的方法是在你的脚本继续做其他事情的同时做其他事情(如果你还有其他事情要做的话),但是,我什至不建议这样做,因为 ASP 中的异步 WinHTTP 是不稳定的。

于 2009-10-02T20:51:30.733 回答
3

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

经典asp中的System.Net.HttpWebRequest?

就像安东尼说的那样,虽然它不是 100% 保证通过的。作为一种可能的解决方法,您可以设置 Response.Buffer = true,将所有输出呈现给用户,调用 Response.Flush,然后执行 waitForResponse 调用。用户将看到整个页面并能够与它进行交互而无需任何阻碍,它使您的异步调用有更多的时间来完成。

于 2009-10-05T10:23:05.727 回答
2

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

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

于 2011-02-22T23:21:35.247 回答