在开发一个项目,通过用户名和密码登录访问一个https网站时,模拟浏览器网页登录访问模式,执行httpsendrequest失败,GetLastError 返回2(系统找不到指定文件)
代码:
int CHttpClient::ExecuteRequest(LPCTSTR strMethod, LPCTSTR strUrl, LPCTSTR strPostData, string &strResponse)
{
CString strServer;
CString strObject;
DWORD dwServiceType;
INTERNET_PORT nPort;
strResponse = "";
AfxParseURL(strUrl, dwServiceType, strServer, strObject, nPort);
if(AFX_INET_SERVICE_HTTP != dwServiceType && AFX_INET_SERVICE_HTTPS != dwServiceType)
{
return FAILURE;
}
//DWORD dwOpenRequestFlags = INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP |
// INTERNET_FLAG_KEEP_CONNECTION |
// INTERNET_FLAG_NO_AUTH |
// INTERNET_FLAG_NO_COOKIES |
// INTERNET_FLAG_NO_UI |
// //设置启用HTTPS
// INTERNET_FLAG_SECURE |
// INTERNET_FLAG_RELOAD;
//m_pSession->SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 1000 * 30);
//m_pSession->SetOption(INTERNET_OPTION_CONNECT_BACKOFF,1000);
//m_pSession->SetOption(INTERNET_OPTION_CONNECT_RETRIES,1);
try
{
m_pConnection = m_pSession->GetHttpConnection(strServer,
dwServiceType == AFX_INET_SERVICE_HTTP ? NORMAL_CONNECT : SECURE_CONNECT,
nPort);
m_pFile = m_pConnection->OpenRequest(strMethod, strObject,
NULL, 1, NULL, NULL,
(dwServiceType == AFX_INET_SERVICE_HTTP ? NORMAL_REQUEST : SECURE_REQUEST));
//m_pFile = m_pConnection->OpenRequest(strMethod, strObject,
// NULL, 1, NULL, NULL,
// dwOpenRequestFlags);
#if 0
DWORD dwFlags;
m_pFile->QueryOption(INTERNET_OPTION_SECURITY_FLAGS, dwFlags);
dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;
set web server option
m_pFile->SetOption(INTERNET_OPTION_SECURITY_FLAGS, dwFlags);
#endif
m_pFile->AddRequestHeaders("Host: sms.huhutv.com.cn");
m_pFile->AddRequestHeaders("Accept: text/html, */*; q=0.01");
m_pFile->AddRequestHeaders("User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36");
m_pFile->AddRequestHeaders("Referer: https://sms.huhutv.com.cn/rtcrm-clientweb/npage/obim/staff/loginmng/initLogin.do");
m_pFile->AddRequestHeaders("Accept-Language: zh-CN,zh;q=0.8");
m_pFile->AddRequestHeaders("Content-Type: application/x-www-form-urlencoded;charset=UTF-8");
m_pFile->AddRequestHeaders("Accept-Encoding: gzip, deflate, sdch");
if(strCookie != ""){
CString str;
str.Format("Cookie:%s",strCookie);
m_pFile->AddRequestHeaders(str);
}else
{
m_pFile->AddRequestHeaders("Cookie: JSESSIONID=6F5AA3FA40C60178D776152742886227; insert_cookie=49078854");
}
m_pFile->AddRequestHeaders("Connection: keep-alive");
//MessageBox(NULL,strCookie.GetString(), "strCookie", MB_OK|MB_ICONINFORMATION);
//ShowFileHeaders();
m_pFile->SendRequest(NULL, 0, (LPVOID)(LPCTSTR)strPostData, strPostData == NULL ? 0 : _tcslen(strPostData));
char szChars[BUFFER_SIZE + 1] = {0};
string strRawResponse = "";
UINT nReaded = 0;
GetURLCookie();
DWORD dwStatus = 0;
DWORD dwStatusLen = sizeof(dwStatus);
m_pFile->QueryInfo(HTTP_QUERY_FLAG_NUMBER | HTTP_QUERY_STATUS_CODE,
&dwStatus, &dwStatusLen, 0);
while ((nReaded = m_pFile->Read((void*)szChars, BUFFER_SIZE)) > 0)
{
szChars[nReaded] = '\0';
strRawResponse += szChars;
memset(szChars, 0, BUFFER_SIZE + 1);
}
int unicodeLen = MultiByteToWideChar(CP_UTF8, 0, strRawResponse.c_str(), -1, NULL, 0);
WCHAR *pUnicode = new WCHAR[unicodeLen + 1];
memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
MultiByteToWideChar(CP_UTF8,0,strRawResponse.c_str(),-1, pUnicode,unicodeLen);
CString cs(pUnicode);
delete []pUnicode;
pUnicode = NULL;
strResponse = cs;
//Clear();
}
catch (CInternetException* e)
{
//Clear();
DWORD dwErrorCode = e->m_dwError;
e->Delete();
DWORD dwError = GetLastError();
CString strErr;
strErr.Format("dwErrorCode = %d", dwErrorCode);
//LOG::out0("dwError = %d", dwError, 0);
MessageBox(NULL,strErr.GetString(), "提示", MB_OK|MB_ICONINFORMATION);
if (ERROR_INTERNET_TIMEOUT == dwErrorCode)
{
return OUTTIME;
}
else
{
return FAILURE;
}
}
return SUCCESS;
}
分析:
1.通过firefox或360浏览器访问该https链接能够正常登录,说明网络和服务器等都没有问题;
2.将代码拷贝到另外一台电脑上运行,执行httpsendrequest没有报错,说明应该是系统存在问题;
经过查找分析后,终于解决;
解决方法:
打开internet explorer, 选择“文件”下拉菜单(没看到的话,按ALT键可以显示菜单栏),然后取消选中“脱机工作”,返回“联机”工作。之后,使用wininet的相关编程将正常工作;SendRequest的返回将正常。
另外,internet explorer的脱机工作,还会导致vpn工具的登录失败问题,导致vpn的服务端网络等问题。