网上关于VC调用WebService的资料已经很详尽了,在此就不多废话了。这里主要讲讲在调用WebService过程中遇到的一些问题。
最初,调用WebService时也返回"调用WebService服务失败或超时"的错误,但一直都没有警觉(认为可能是因为网络的原因造成的),现在想来真应该嘲笑一下自己。程序员应该一个警称的态度对态自己的工作及自己编写的代码,不应该存在任何原因的幻想。呵呵~~~言归正传,过了几天以后,发现程序除了最初的几个WebService调用外,其后的任何WebService都返回失败(看吧,这就是后果~~~)。
启动调试器,执行单步调试。发现在
CAtlHttpClientT<TSocketClass>::ParseStatusLine(BYTE* pBuffer) //这个函数返回的失败代码
具体代码如下:
// pBuffer better be pointing at the status code now
LPCSTR pEnd = NULL;
if (*pBuffer >= '0' && *pBuffer <= '9')
{
// probably a good status code
m_nStatus = strtol((LPSTR)pBuffer, (LPSTR*)&pEnd, 10);
if (Checked::get_errno() == ERANGE)
return NULL; // bad status code --- return here
}
else
return FALSE; // bad status code;
在调试程序中,m_nStatus=200,Checked::get_errno() 返回34,显然返回的调用错误代码为ERANGE.并传回空值表示HTTP头解析失败(RR_PARSEHEADERS_FAILED).从而导致VS2005调用WebService发送请求参数失败.
问题是找到了,可是要如何解决呢?
在网上搜索相关信息.嘿嘿,终不负有心人.找了半天终于找到了.原来不仅需要打上VS2005补丁,还要在调用Checked::get_errno()前将错误代码清0.
参考信息:
VS2005 Sp1补丁下载地址: http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&familyid=bb4a75ab-e2d4-4c96-b39d-37baf6b5b1dc
在安装VS2005 SP1补丁是一个既漫长又痛苦的过程,用时甚至比安装整个VS2005还要长.安装时C盘大约需要4G的空间(如果硬盘不够先即时清理吧,否则到时候有得你折腾滴).我苦苦守候了整整2个半小时,CPU占用率一直为100%,什么事都干不了,郁闷~~~~建议等到中午吃饭或者晚上的时候再安装.参考BLOG:恐怖的vs2005 sp1安装过程.
修改后的代码如下:
// pBuffer better be pointing at the status code now
LPCSTR pEnd = NULL;
if (*pBuffer >= '0' && *pBuffer <= '9')
{
// probably a good status code
m_nStatus = strtol((LPSTR)pBuffer, (LPSTR*)&pEnd, 10);
Checked::set_errno(0); //新增加代码,在调用get_error前先将错误代码清空.如果没有安装
//SP1 不能进行链接
if (Checked::get_errno() == ERANGE)
return NULL; // bad status code
}
else
return FALSE; // bad status code;
最后重新编译工程.安啦,没有出现类似错误.任务圆满解决!!!