使用wininet异步下载数据,程序流程是:
InternetOpen(……)
InternetConnect(……)
InternetSetStatusCallback(……)
HttpOpenRequest(……)
HttpSendRequest(……)整个流程都没有任何问题,但是每次当InternetStatusCallback回调被触发,并且状态码为INTERNET_STATUS_REQUEST_COMPLETE时,参数lpvStatusInformation并不是MSDN中所说的类型LPINTERNET_ASYNC_RESULT!!
代码如下:
LPINTERNET_ASYNC_RESULT pAsync = (LPINTERNET_ASYNC_RESULT)lpvStatusInformation;
if (pAsync && pAsync->dwResult  )
{
//发现这里的pAsync->dwResult永远都是1,而不是一个HINTERNET或者其指针(MSDN中描述是HINTERNET指针)
ATLASSERT((DWORD) pAsync->dwResult == 1 );
DWORD nLen = sizeof(DWORD);
HttpQueryInfo( (HINTERNET)(pAsync->dwResult) , HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER , &code , &nLen , NULL );
//无法得到HTTP Header中的状态码
}而且,如果我用InternetStatusCallback中的hInternet参数来调用HttpQueryInfo查询HTTP状态码,发现返回的结果永远都是200,从来不会有403等其他值。即使服务器确实返回的是403,我用抓包工具能清楚的看到返回的状态码是403.两个问题:
1.到底发生了什么事情?
2.使用Winiet异步下载数据时,应该在那个阶段查询HTTP header,主要是HTTP status code。