VS c++ soap 获取WebServiece的错误记录 实质错误是errno的错误
2017-10-25 19:13
190 查看
在VS2015的开发环境,用添加web引用的方式获取webservice,第一次请求一个服务接口总是出错,然后运行了一段其他代码,再次请求这个接口就成功了。一直找原因,也没有找到。
问题出在解析服务反应头的"200 OK\r\n......."的码的转化上,获取的errorno的总是34的类型。
曾经以为是内存不足,泄露的问题,或者是这段内容解析不成功。但是单独摘出来放在新建的简单工程里面测试都通过。我后面就不得不扩大范围,后面把真个webservice的添加web引用,单独做了一个dll,让另一个简单项目调用,一直没有出错。
后面再测试一下其他内容,然后把项目中的这个功能代码去掉,专门调用dll的导出方法,再试试看是能不能成功吧。
检测出错的位置是在 atlhttp.inl的
emplate <class TSocketClass>
inline typename CAtlHttpClientT<TSocketClass>::HTTP_RESPONSE_READ_STATUS CAtlHttpClientT<TSocketClass>::ReadHttpResponse()
{
。。。。。。
// read from the socket until we have a complete set of headers.
pBodyBegin = FindHeaderEnd(&pHeaderBegin);
if (!pBodyBegin)
{
if (!ReadSocket())
{
。。。。。
// 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
}
但是这里的strtol的转换的值是200,是不是会超出范围的。这让人很疑惑,是不是有内存泄露的其他问题。
后面经过几个测试:
1,将使用webservice的代码单独提出来放在一个新工程里面测试是成功的。但是使用动态库给导出这个方法,让原来的程序替换使用,结果还是出错。
2,将访问webservice的代码放在构造函数里面测试正确,放回原处就不行,于是将该方法逐个过程放置,最后在放在 一个看到_wtol的时候,突然觉察是这里出错了。
最终确认真正的错误是下面的代码
CString strSize = _T("5108983296");
ULONGLONG m_ullMirrorSize = _wtol(strSize.GetBuffer());
验证
CString strSize = _T("5108983296");
if (Checked::get_errno() == ERANGE)
return ; // bad status code
ULONGLONG m_ullMirrorSize = _wtol(strSize.GetBuffer());
if (Checked::get_errno() == ERANGE)
return ; // bad status code
如果想修复这个errno让程序继续下去,可以这么做 Checked::set_errno(0);
if (Checked::get_errno() == ERANGE)
return ; // bad status code
问题出在解析服务反应头的"200 OK\r\n......."的码的转化上,获取的errorno的总是34的类型。
曾经以为是内存不足,泄露的问题,或者是这段内容解析不成功。但是单独摘出来放在新建的简单工程里面测试都通过。我后面就不得不扩大范围,后面把真个webservice的添加web引用,单独做了一个dll,让另一个简单项目调用,一直没有出错。
后面再测试一下其他内容,然后把项目中的这个功能代码去掉,专门调用dll的导出方法,再试试看是能不能成功吧。
检测出错的位置是在 atlhttp.inl的
emplate <class TSocketClass>
inline typename CAtlHttpClientT<TSocketClass>::HTTP_RESPONSE_READ_STATUS CAtlHttpClientT<TSocketClass>::ReadHttpResponse()
{
。。。。。。
// read from the socket until we have a complete set of headers.
pBodyBegin = FindHeaderEnd(&pHeaderBegin);
if (!pBodyBegin)
{
if (!ReadSocket())
{
。。。。。
// 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
}
但是这里的strtol的转换的值是200,是不是会超出范围的。这让人很疑惑,是不是有内存泄露的其他问题。
后面经过几个测试:
1,将使用webservice的代码单独提出来放在一个新工程里面测试是成功的。但是使用动态库给导出这个方法,让原来的程序替换使用,结果还是出错。
2,将访问webservice的代码放在构造函数里面测试正确,放回原处就不行,于是将该方法逐个过程放置,最后在放在 一个看到_wtol的时候,突然觉察是这里出错了。
最终确认真正的错误是下面的代码
CString strSize = _T("5108983296");
ULONGLONG m_ullMirrorSize = _wtol(strSize.GetBuffer());
验证
CString strSize = _T("5108983296");
if (Checked::get_errno() == ERANGE)
return ; // bad status code
ULONGLONG m_ullMirrorSize = _wtol(strSize.GetBuffer());
if (Checked::get_errno() == ERANGE)
return ; // bad status code
如果想修复这个errno让程序继续下去,可以这么做 Checked::set_errno(0);
if (Checked::get_errno() == ERANGE)
return ; // bad status code
相关文章推荐
- 错误记录--Invalid root. The WEB-INFflex folder must contain either flex-config.xml or services-config.xml
- “无法获取web应用程序服务”是什么错误?-
- 错误记录:Cannot change version of project facet Dynamic Web Module to 2.5
- Yaws(erlang web服务器框架) 学习记录之获取GET/POST请求参数
- webviewJavascriptBridge奇葩错误记录
- 用python发送QQ邮件遇到的错误记录(ssl.SSLError: [Errno 1] _ssl.c:504)
- ajax return返回值获取不到-【开发错误记录】。
- 正式项目中,web项目中的slf4j* jar包 删除 -- 项目错误记录
- 使用Jmail及Winwebmail发信时系统记录中的错误:502 Error: command ...
- httpwebrequest 模拟登录 获取cookies 以前的代码,记录备忘!
- curl_errno返回值获取错误信息
- 从配置中获取连接字符串信息是出现以下错误 无法获取 web 应用程序服务
- Java Web Project自定义错误页面,log4j记录日志。
- MySql错误记录:(外键重复)报错Can't create table 'usersys.#sql-618_1' (errno: 121)
- 获取UltraWebGrid选择记录指定字段的值
- WebException获取详细内容 记录
- 一次MySQL主从搭建出现“Last_IO_Errno: 1236”错误的处理记录
- errno获取错误
- 执行 npm run update-webdriver 提示文件不能获取错误
- asp.net Web项目中使用Log4Net进行错误日志记录