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

Posted

技术标签:

【中文标题】下次我使用相同的连接句柄调用 WinInet 调用 HttpSendRequest 时,它不会传递身份验证信息【英文标题】:WinInet call HttpSendRequest doesn't pass auth information next time when I call it with the same connection handle 【发布时间】:2013-02-05 23:58:20 【问题描述】:

我对遇到的以下问题感到困惑。我们使用安装了 IE 8.0Windows 2008 R2 机器。接下来,我尝试通过 InternetConnect 调用以编程方式连接到服务器(身份验证凭据作为传递给它的参数提供)。它成功了。接下来我调用 HttpOpenRequestHttpSendRequest。对 HttpOpenRequestHttpSendRequest 的调用是使用返回的相同连接句柄 InternetConnect 调用执行的。在某个特定时间点 HttpSendRequest 开始失败。从流量捕获中,我看到缺少身份验证信息,它使服务器轮流返回 401 结果。使用 INTERNET_OPTION_USERNAMEINTERNET_OPTION_PASSWORD 提供的 InternetSetOption 调用不起作用。 HttpSendRequest 失败后,我调用 GetLastError 并首先接收 ERROR_HTTP_INVALID_SERVER_RESPONSE 和第二个 ERROR_INTERNET_INCORRECT_HANDLE_STATE 如果我尝试重新发送我对 HttpSendRequest 的请求。

也许你们当中有人遇到过类似的问题?

【问题讨论】:

【参考方案1】:

我发现这是客户行为的正常方式。首先它尝试匿名联系资源,然后如果失败,它会尝试使用凭据。在单个函数调用中,有一个 401 结果是可以的,因为下一个请求伴随着身份验证凭据。

【讨论】:

如果您已经知道需要发送身份验证标头怎么办?反正有没有强制请求,所以它不必发生两次?这是很多开销。 目前我停止了对这个话题的调查,因为我不再需要这样做了。但据我了解,使用 WinINet 设置身份验证数据是正常的。反过来,WinINet 使用您提供的凭据进行第一次连接尝试,但是当服务器响应拒绝访问时,它会重新发送添加了身份验证标头的请求。我意识到这个序列发生在单个 WinINet 连接调用期间。因此,对于 API 用户来说,它是透明地发生的,您可能不想深入了解这些细节。

以上是关于下次我使用相同的连接句柄调用 WinInet 调用 HttpSendRequest 时,它不会传递身份验证信息的主要内容,如果未能解决你的问题,请参考以下文章

调用使用 Java + JNA 的 WinInet 函数

通过 WinInet 下载数据

Wininet 是不是处理 HTTP 标头值“Set-Cookie”?

WinInet ftp 连接错误 123

如何以编程方式清除 WinInet SSL 状态(是不是有 Windows API 调用)?

redis mysql 连接池 之 golang 实现