一个奇怪的https请求问题,和用户有关

sokol 2015-11-07 08:35:36
这两天突然发现之前写的一个https post函数突然不能工作了,代码如下:

BOOL CHttpClient::doPost(CString href, CStringA& response, LPCTSTR referer)
{
BOOL ret = FALSE;
response = "";

CString strServerName;
CString strObject;
INTERNET_PORT nPort;
DWORD dwServiceType;
AfxParseURL((LPCTSTR)href, dwServiceType, strServerName, strObject, nPort);

DWORD dwFlags = INTERNET_FLAG_NO_AUTO_REDIRECT;
if(dwServiceType == AFX_INET_SERVICE_HTTPS)
{
dwFlags |= INTERNET_FLAG_SECURE;
}

CInternetSession sess(_T("Microsoft Internet Browser"));
CHttpConnection* conn = NULL;
CHttpFile* pFile = NULL;

DWORD retcode;

int ilen = WideCharToMultiByte(CP_UTF8, 0, strParam, -1, NULL, 0, NULL, NULL);
char *utf8temp = new char[ilen+1];
memset(utf8temp, 0, ilen +1);
WideCharToMultiByte (CP_UTF8, 0, (LPCTSTR)strParam, -1, utf8temp, ilen, NULL, NULL);

try
{
conn = sess.GetHttpConnection(strServerName, nPort);

pFile = conn->OpenRequest(CHttpConnection::HTTP_VERB_POST, strObject, referer, 1, NULL, _T("HTTP/1.1"), dwFlags);

pFile->AddRequestHeaders(_T("Content-Type: application/x-www-form-urlencoded"));
pFile->AddRequestHeaders(_T("Accept: */*"));
pFile->SendRequest(NULL, 0, utf8temp, ilen);
pFile->QueryInfoStatusCode(retcode);

char buffer[8192];
UINT len = 0;
while((len=pFile->Read(buffer, 8192)) > 0)
{
response.Append(buffer, len);
}

ret = TRUE;
}
catch(CFileException* e)
{
e->Delete();
}
catch (CInternetException* e)
{
e->Delete();
};

if(pFile)
{
pFile->Close();
delete pFile;
}

delete[] utf8temp;

conn->Close();
delete conn;
sess.Close();

return ret;
}

这个在之前一直工作的好好的,经过反复测试发现这个函数在普通用户身份下工作正常,在SYSTEM身份下不能工作,抛出异常CInternetException 错误码为12029即ERROR_INTERNET_CANNOT_CONNECT,换了别的机器绝大多数能正常工作。

测试结果总结一下:
1. 只有https请求才会出错
2. 只有SYSTEM账户下(后台服务)时才会出错,如果把服务的运行用户改成普通用户就正常了
3. 只有少量机器会出错

所以这个问题已经可以确定测试的这台机器SYSTEM用户有某种问题,但这个用户环境一般是无法被用户破坏的,那么究竟这个SYSTEM用户环境发生了什么变化呢?又有什么办法能够让SYSTEM环境重置呢。或者有什么办法能获得更多的出错信息呢?
...全文
178 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2015-11-30
  • 打赏
  • 举报
回复
服务程序中打个log看看,看看那个接口函数调用失败了?
oyljerry 2015-11-30
  • 打赏
  • 举报
回复
用WINHTTP API试试,可能API本身对服务进程支持不够好
赵4老师 2015-11-09
  • 打赏
  • 举报
回复
在正常和不正常的电脑上分别运行depends.exe查看exe依赖的dll及其版本号。
sokol 2015-11-08
  • 打赏
  • 举报
回复
咋没人恢复内

18,355

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧