启用脱机工作时,HttpSendRequest 返回失败/错误代码 2

Posted

技术标签:

【中文标题】启用脱机工作时,HttpSendRequest 返回失败/错误代码 2【英文标题】:HttpSendRequest returns failure / error code 2 when Work Offline enabled 【发布时间】: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 因为在我遇到问题的时候,我不知道它处于“脱机工作”模式。如果有人已经知道答案,为什么要把它放在问题中?我也没有问代码有什么问题,我问为什么一个函数会返回一个特定的错误。这个返回的错误很大程度上与代码本身无关(多个失败的样本),我没有在问题中提供任何代码,因为我已经发现它是导致它的系统状态。 【参考方案1】:

当Windows/Internet Explorer is set to "Work offline" and the resource is not in the offline cache 时,HttpSendRequest() 将失败,错误代码为 2 (ERROR_FILE_NOT_FOUND)。

这似乎不会影响基于 .Net 的 HTTP 客户端或其他 Web 浏览器(如 FireFox 或 Chrome),因此如果 Internet Explorer 不是主要或默认浏览器,则不会立即显现出来。

您可以通过打开 Internet Explorer、转到文件菜单(如果不可见,请按 Alt)并取消选中“离线工作”来返回“在线”状态。此后,以编程方式尝试使用 WinInet 将正常工作。

请注意,如果您为测试或偶尔使用而设置拨号/*** 连接并且未设置为“从不拨号连接”,Windows/Internet Explorer 可能会意外进入此状态

【讨论】:

以上是关于启用脱机工作时,HttpSendRequest 返回失败/错误代码 2的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Microsoft Lync 2010 中启用“显示脱机”

更新脱机缓存(Chrome On Mobile)

Loadrunner 并发时'Error -27492 HttpSendRequest failed'解决办法

下次我使用相同的连接句柄调用 WinInet 调用 HttpSendRequest 时,它不会传递身份验证信息

Wion32 的 HttpSendRequest : ERROR_INTERNET_INCORRECT_HANDLE_STAT

为啥OUTLOOK总是脱机工作