下面是个控制台的样例
Toolkit3.0 终于给出VC6的样例了,1.0只能看到VB和ASP的
#include <stdio.h>
#import "msxml4.dll"
using namespace MSXML2;
#import "C:/Program Files/Common Files/MSSoap/Binaries/mssoap30.dll" /
using namespace MSSOAPLib30;
void Add()
{
}
int main()
{
}
更改 EndPointURL 属性的值. 在URL里指定你的服务器名.
OK
总结一下必要的关键步骤
1.导入类型库
2.需要创建一个SoapConnector
3.下一步创建SoapSerializer
4.下一步把消息附加到SoapConnector的输入流
5.下一步读取结果.要读取服务器的回复,客户端应用需要使用SoapReader,
6.SoapReader被连接到SoapConnector输出流
7.用IXMLDOMElement对象可以从SoapReader里读到服务器的回复
vc7.0 调用web services
//somehow the soap header dose not work now.
remember invoke Coinitialize(NULL)
add web services by right click the project and select add web reference.
CoInitialize(NULL); //initialize the com
CMemberServices *ms = new CMemberServices();;
int i;
DiskUsageInfo *_disk;
HRESULT hr;
CString username = "FZ566591079";
CString password = "1705649467";
CComBSTR bUserName, bPassword;
bUserName = username.AllocSysString();
bPassword = password.AllocSysString();
hr = ms->GetDiskUsage3(bUserName, bPassword, &_disk, &i);
if (FAILED(hr))
{
printf("Something happened when you call web services!");
}
else
{
printf("There are %d results returned", i);
}
::SysFreeString(bUserName);
::SysFreeString(bPassword);
delete ms;
return 0;
http://www.lokad.com/web-services-time-series-forecasting-tutorial-cpp.ashx
http://blog.tulipmm.cn/category/code/
ATL调用WebService倒是很简单,添加Web引用,好多代码就自动生成了。但是实际使用的时候遇到了一些问题:无论调用多少次Login,在调用其它方法的时候,服务器端查询Session总是为null。
还好我对Session机制也算了解,初步判断是客户端调用的时候并没有把Cookie内容放在HttpHeaders里面发回服务器——ATL类库并没有提供这样的实现。有两种方法可以解决这个问题:
1、修改WebService接口:在Login成功后返回SessionID到客户端,客户端每次调用后续方法的时候都在WebService方法的参数中传递这个SessionID;服务器端通过SessionID查找Session。这样的话就要现有的WebService就不能使用了,需要修改WebService增加新的方法,显然不是一个很好的解决办法。
2、修改客户端ATL类,使它可以保存Cookie。这样Web服务代码不需要修改,不会影响现有的其他客户端使用。
权衡得失,决定修权衡得失,决定修改ATL代码。研究发现添加Web引用后自动生成这样的代码
马上写了一个CAtlHttpClientT的子类重写这两个方法:
template <class TSocketClass>
class CCookieEnabledHttpClient
public CAtlHttpClientT<TSocketClass>
{
public:
CCookieEnabledHttpClient
{
}
public:
CString m_strCookies;
public:
bool Navigate(
const CUrl *pUrl,
ATL_NAVIGATE_DATA *pData
) throw(...)
{
CAtlNavigateData navData(*pData);
CString strHeaders = pData->szExtraHeaders;
strHeaders.Format(_T("%sCookie:%s/r/n"), strHeaders, m_strCookies);
navData.SetExtraHeaders(strHeaders);
return CAtlHttpClientT<TSocketClass>::Navigate(pUrl, &navData);
}
void OnSetCookie(LPCTSTR lpszStr) throw()
{
m_strCookies = lpszStr;
return;
}
};