在ASP中使用WinHttp.WinHttpRequest.5.1实现异步HttpRequest

9

我正在尝试制作链接查找器并遇到了两个问题

问题1 (已解决) :: 无法获取重定向页面的URL

这个问题通过使用 WinHttp.WinHttpRequest.5.1参考链接得以解决。

问题2 (未解决) :: 无法使用 WinHttp.WinHttpRequest.5.1 对象事件 或没有回调到异步请求

同步请求代码

Set req = CreateObject("WinHttp.WinHttpRequest.5.1")
req.open "GET", url, FALSE
req.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
req.send PostData

这个工作没问题,但如果我有多个请求,那么它需要太长时间。

我尝试了以下异步请求代码,但是出现错误。

Set req = CreateObject("WinHttp.WinHttpRequest.5.1")
req.open "GET", url, TRUE
req.OnReadyStateChange = GetRef("req_OnReadyStateChange")
req.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
req.send PostData

Function req_OnReadyStateChange
   ' do something
End Function  

代码 1

Set req = CreateObject("WinHttp.WinHttpRequest.5.1","req_")
req.open "GET", url, TRUE
Function req__OnResponseFinished
  ' do something
End Function
req.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
req.send PostData

错误 - 远程服务器计算机不存在或不可用:'CreateObject'

代码 2

Set req = CreateObject("WinHttp.WinHttpRequest.5.1")
req.open "GET", url, TRUE
req.OnResponseFinished = GetRef("req_OnResponseFinished")
Function req_OnResponseFinished
   ' do something
End Function
req.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
req.send PostData

错误:对象不支持此属性或方法:'req.OnResponseFinished'

代码3

Set req = CreateObject("WinHttp.WinHttpRequest.5.1")
req.open "GET", url, TRUE
req.OnReadyStateChange = GetRef("req_OnReadyStateChange")
req.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
req.send PostData
 Function req_OnReadyStateChange
   ' do something
End Function

在微软文档中,他们提到WinHttp.WinHttpRequest.5.1有4个事件。

  1. OnError
  2. OnResponseDataAvailable(当接收到来自服务器的数据时)
  3. OnResponseFinished(当响应完成并且所有数据可用时)
  4. OnResponseStart(当接收到响应数据时)

但我没有找到如何使用这些事件的示例,也无法在ASP中使用这些事件。

希望能快速回复...

1个回答

3

你尝试过使用子程序(Sub)代替函数(Function)来处理"req_OnReadyStateChange"吗?

顺便说一下,我正在使用MSXML2.ServerXMLHTTP对象,这个方法很好用。你使用WinHttp API的原因是什么呢?

使用MSXML2.ServerXMLHTTP的示例:

<%
dim url : url = "http://localhost"
dim XmlHttp : set XmlHttp = server.createobject("MSXML2.ServerXMLHTTP")
XmlHttp.onreadystatechange = getRef("doHttpReadyStateChange")
XmlHttp.open "GET", url, true
XmlHttp.send()

sub doHttpReadyStateChange
    response.write XmlHttp.readyState
    response.write "<br>"

    select case XmlHttp.readyState
        case 0  'UNINITIALIZED

        case 1  'LOADING

        case 2  'LOADED

        case 3  'INTERACTIVE

        case 4  'COMPLETED
            response.write "Done"
    end select
end sub
%>

是的,我需要重定向后的最终URL,这就是为什么我使用WinHttp.WinHttpRequest.5.1的原因。更多信息,请查看http://stackoverflow.com/questions/20358654/serverxmlhttp-request-returing-data-but-not-returning-url-of-final-page-after-30。 - Dr_Dang
@Dr_Dang 好的,你尝试过使用Sub而不是Function来处理OnReadyStateChange事件吗? - ulluoink

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