下次我使用相同的连接句柄调用 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.0 的 Windows 2008 R2 机器。接下来,我尝试通过 InternetConnect 调用以编程方式连接到服务器(身份验证凭据作为传递给它的参数提供)。它成功了。接下来我调用 HttpOpenRequest 和 HttpSendRequest。对 HttpOpenRequest 和 HttpSendRequest 的调用是使用返回的相同连接句柄 InternetConnect 调用执行的。在某个特定时间点 HttpSendRequest 开始失败。从流量捕获中,我看到缺少身份验证信息,它使服务器轮流返回 401 结果。使用 INTERNET_OPTION_USERNAME 和 INTERNET_OPTION_PASSWORD 提供的 InternetSetOption 调用不起作用。 HttpSendRequest 失败后,我调用 GetLastError 并首先接收 ERROR_HTTP_INVALID_SERVER_RESPONSE 和第二个 ERROR_INTERNET_INCORRECT_HANDLE_STATE 如果我尝试重新发送我对 HttpSendRequest 的请求。
也许你们当中有人遇到过类似的问题?
【问题讨论】:
【参考方案1】:我发现这是客户行为的正常方式。首先它尝试匿名联系资源,然后如果失败,它会尝试使用凭据。在单个函数调用中,有一个 401 结果是可以的,因为下一个请求伴随着身份验证凭据。
【讨论】:
如果您已经知道需要发送身份验证标头怎么办?反正有没有强制请求,所以它不必发生两次?这是很多开销。 目前我停止了对这个话题的调查,因为我不再需要这样做了。但据我了解,使用 WinINet 设置身份验证数据是正常的。反过来,WinINet 使用您提供的凭据进行第一次连接尝试,但是当服务器响应拒绝访问时,它会重新发送添加了身份验证标头的请求。我意识到这个序列发生在单个 WinINet 连接调用期间。因此,对于 API 用户来说,它是透明地发生的,您可能不想深入了解这些细节。以上是关于下次我使用相同的连接句柄调用 WinInet 调用 HttpSendRequest 时,它不会传递身份验证信息的主要内容,如果未能解决你的问题,请参考以下文章
Wininet 是不是处理 HTTP 标头值“Set-Cookie”?