调用WinHttpQueryHeaders返回ERROR_WINHTTP_INCORRECT_HANDLE_STATE问题求助
WinHTTP 12019错误原因及排查方案
错误根因
你遇到的ERROR_WINHTTP_INCORRECT_HANDLE_STATE(错误码12019)核心触发原因是*WinHttpQueryHeaders的调用时机不符合WinHTTP句柄的状态要求*。
WinHttpQueryHeaders只能在请求句柄已经成功接收服务器响应头的状态下调用,而你的代码在WinHttpSendRequest调用失败后直接执行WinHttpQueryHeaders,此时请求还没有完成发送、也没有接收服务器返回的响应头,句柄状态不允许读取响应头,因此触发错误。
WinHTTP请求句柄的合法状态流转
WinHTTP的请求操作必须严格遵循以下状态流转顺序,否则都会触发状态错误:
- 调用
WinHttpOpen获取会话句柄 - 调用
WinHttpConnect获取连接句柄 - 调用
WinHttpOpenRequest获取请求句柄 - 调用
WinHttpSendRequest向服务器发送请求 - 必须调用
WinHttpReceiveResponse等待服务器返回响应,确认响应头已经被写入请求句柄 - 上述步骤全部完成后,才能调用
WinHttpQueryHeaders读取状态码、响应头字段等信息
代码修正&排查方向
- 首先不要在
WinHttpSendRequest返回失败的分支中调用WinHttpQueryHeaders,应该先调用GetLastError排查请求发送失败的具体原因,比如网络不通、证书校验失败等。 - 只有
WinHttpSendRequest返回成功后,再调用WinHttpReceiveResponse,该函数返回成功后再执行WinHttpQueryHeaders读取状态码。 - 针对身份认证场景,读取到401/407状态码后,调用
WinHttpSetCredentials设置对应凭据,之后重新发起请求即可走通认证流程。 - 你当前的
WinHttpOpenRequest硬编码了请求路径为L"/debug.txt",没有使用urlComp中解析出的实际请求路径,也会导致后续请求不符合预期,建议修正为传入urlComp.lpszUrlPath参数。
内容的提问来源于stack exchange,提问作者Guy Sadoun
相关产品推荐
相关产品推荐

