关于VS2005 调用WebService返回发送请求数据失败问题

来源:互联网 发布:网络攻防大赛 宁夏 编辑:程序博客网 时间:2024/05/23 19:19

  网上关于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.

参考信息:

http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.webservices/2006-12/msg00073.html

 

http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/3efe7b74-c21b-42f4-9e68-65cb23beec05/

 

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;

 

 

最后重新编译工程.安啦,没有出现类似错误.任务圆满解决!!!

原创粉丝点击