【发布时间】:2013-09-04 10:23:35
【问题描述】:
我正在尝试使用 WinInet 发出 HTTP 请求,HttpSendRequest() 有时会返回失败,而其他应用程序和浏览器似乎可以访问 Internet。
当我检查 GetLastError() 时,它返回 2。这不是 standard WinInet error codes 之一,但它可能是 Win32 ERROR_FILE_NOT_FOUND。
这在多段代码中失败,但这是我可以轻松测试的一段:
'Split up the URL into its component parts
URLInfo = SplitURL(URL)
AuthFlags = IIf(URLInfo.lpszUserName = "" And URLInfo.lpszPassword = "", INTERNET_FLAG_NO_AUTH, 0)
'Create the connection to the server
SessionHandle = InternetConnect(InetHandle, URLInfo.lpszHostName, URLInfo.nPort, URLInfo.lpszUserName, URLInfo.lpszPassword, URLInfo.nScheme, AuthFlags, 0)
If SessionHandle = 0 Then
Err.Raise HTTPErrorInitSession, , "Failed to initialise the HTTP session: " & Cstr(Err.LastDllError)
End If
'Create the request for the resource
RequestHandle = HttpOpenRequest(SessionHandle, IIf(PostData = "", "GET", "POST"), URLInfo.lpszUrlPath & URLInfo.lpszExtraInfo, "HTTP/1.1", vbNullString, vbNullString, INTERNET_FLAG_RELOAD Or INTERNET_FLAG_NO_CACHE_WRITE Or AuthFlags, 0)
If RequestHandle = 0 Then
Err.Raise HTTPErrorInitRequest, , "Failed to initialise the HTTP request: " & Cstr(Err.LastDllError)
End If
'Send the request
RequestSent = (HttpSendRequest(RequestHandle, SendHeaders, Len(SendHeaders), vbNullString, 0) = 1)
'Wait for the "success" message
If Not RequestSent Then
Err.Raise HTTPErrorNoHost, , "Failed to connect to the HTTP server: " & Cstr(Err.LastDllError)
End If
我尝试运行数据包捕获并在失败时查看网络流量,甚至没有尝试建立连接。
这里发生了什么,为什么它似乎是随机发生的?
【问题讨论】:
-
请分享您的代码。
-
@EricLaw 什么代码?这是一个已经解决的问题,我发布了一个问题并为遇到它的其他任何人提供答案(explicitly encouraged 也是如此)。有人愿意解释近距离投票吗?
-
@EricLaw 请注意,这发生在多个代码示例(均基于 WinInet)中,并且在启用“脱机工作”时,它们都在
HttpSendRequest()上失败。一旦它被禁用,之后一切都开始工作了。 -
您的原始问题没有提到您启用了“离线工作”,并且您没有更新问题。我没有注意到您回答了自己的问题(部分原因是您还不能接受自己的答案)以提供更多信息。是的,“我的代码有什么问题?”应附有上述代码。
-
@EricLaw 因为在我遇到问题的时候,我不知道它处于“脱机工作”模式。如果有人已经知道答案,为什么要把它放在问题中?我也没有问代码有什么问题,我问为什么一个函数会返回一个特定的错误。这个返回的错误很大程度上与代码本身无关(多个失败的样本),我没有在问题中提供任何代码,因为我已经发现它是导致它的系统状态。