作者:朱金灿
来源:blog.csdn.net/clever101
最近做一个项目,需要使用Web Service。首先简要介绍一下Web Service(对此我也是初学者)。据微软的人介绍:Web Service能够用于任何地方、任何时候和任何设备上(感觉有点吹牛),能够在一个分布式的计算环境中动态地描述、发现和调用服务,是一种Web上的对象访问技术。这种定义有点学术意味,我用我对它的粗浅的理解来描述:从开发的角度来看,它其实是一种远程调用,这和登陆网站比较类似,比如你登陆google网站,在那个对话框中输入“牛顿”来搜索牛顿的相关信息,而对Web Service而言,就是你使用A机子,在你的客户端程序中定义一个变量string Name = “牛顿”,然后输入远程服务器的URL和搜索函数名Search(), 再CALL(URL, Search, Name),这样远程服务器就把搜索结果以xml结构的方式发给你的客户端程序,是不是有点神奇?这种调用可以显式的,也可以是隐藏的。对开发人员来说这种调用的好处是因为Web Service是基于组件的,这意味着可以跨语言平台,而且处理结果是以xml结构发回来,也大大方便了对结果的解释。
使用Web Service需要先安装IIS 5.0(XP上安装IIS 5.0,Server 2003上安装IIS 6.0,如果你使用VS 2005,同时你先安装VS 2005后安装IIS5.0,那么你需要运行一个注册命令把IIS5.0通知给VS2005,因为IIS 5.0是基于.Net 1.0,而VS 2005配置的是.Net 2.0)。
现在我们开始测试一下,具体做法是使用VS 2005建立一个Web Service,使用VC++ 6.0建立一个客户端的桌面程序,使用VS 2005建立一个Web Service,然后使用这个桌面程序调用这个Web Service。
使用VS 2005建立一个Web Service的步骤:
“新建”——〉“网站”——〉
模板选择“ASP.NET WEB服务”,位置选择“HTTP”,http://localhost/MyWeb,语言选择“Visual C#”,如下图:
添加一个WEB方法(实际上就是被远程调用的那个函数,实现两个字符串相加,输出结果字符串):
- [WebMethod]
- public string StringsAdd(string strLeft,int strRight)
- {
- return strLeft + strRight;
- }
然后单击菜单上的“生成解决方案”,按F5调试运行,页面如下:
可以看到上面已经有了一个StringsAdd的链接,单击进去,可以看到里面有两个输入参数框和一个调用按钮,如下图:
下面我们使用VC++ 6.0建一个对话框程序CallWebMethod来调用这个WEB方法,界面如下:
- // 注意组件的位置根据自己的系统环境来取得
- #import "msxml4.dll"
- using namespace MSXML2;
- #import "C:/Program Files/Common Files/MSSoap/Binaries/MSSOAP1.dll" /
- exclude("IStream", "IErrorInfo", "ISequentialStream", "_LARGE_INTEGER", /
- "_ULARGE_INTEGER", "tagSTATSTG", "_FILETIME")
- using namespace MSSOAPLib;
同时定义对话框类三个成员变量:
- ISoapSerializerPtr Serializer;
- ISoapReaderPtr Reader;
- ISoapConnectorPtr Connector;
2. 在按钮消息命令函数加入如下代码:
- void CCallWebMethodDlg::OnBtnCallweb()
- {
- // TODO: Add your control notification handler code here
- CoInitialize(NULL);
- // 与Web服务连接
- Connector.CreateInstance(__uuidof(HttpConnector));
- // http://localhost/MyWeb/Service.asmx?op=StringsAdd为调用页面
- Connector->Property["EndPointURL"] = "http://localhost/MyWeb/Service.asmx?op=StringsAdd";
- Connector->Connect();
- // 开始消息,http://tempuri.org/StringsAdd为响应函数,
- Connector->Property["SoapAction"] = "http://tempuri.org/StringsAdd";
- Connector->BeginMessage(); //启动消息句柄
- // 创建SoapSerializer对象
- Serializer.CreateInstance(__uuidof(SoapSerializer));
- //将 serializer 连接到 connector 的输入字符串
- Serializer->Init(_variant_t((IUnknown*)Connector->InputStream));
- //////////////////////
- // 创建SOAP消息
- Serializer->startEnvelope("","","");
- Serializer->startBody("");
- // 找到WEB函数名
- Serializer->startElement("StringsAdd","http://tempuri.org/","","");
- // 找到第一个参数
- Serializer->startElement("strLeft","http://tempuri.org/","","");
- // 输入第一个参数值
- Serializer->writeString("Hello,");
- Serializer->endElement();
- // 找到第二个参数
- Serializer->startElement("strRight","http://tempuri.org/","","");
- // 输入第二个参数值
- Serializer->writeString("World!");
- Serializer->endElement();
- Serializer->endElement();
- Serializer->endBody();
- Serializer->endEnvelope();
- //将该消息发送给web服务
- Connector->EndMessage(); //将消息送往服务器
- //读取响应
- Reader.CreateInstance(__uuidof(SoapReader));
- //将reader联接到connector的输出字符串
- Reader->Load(_variant_t((IUnknown*)Connector->OutputStream), "");
- //显示结果
- AfxMessageBox((const char *)Reader->Body->xml);//以xml格式输出
- }
其中SoapAction 参数值可以通过以下方式获取:
在http://localhost/MyWeb/Service.asmx加?wsdl然后按回车,如下图所示:
程序运行结果如下图,可以看到“Hello,World!”的输出:
如果你想单纯输出Hello,World!,可以在函数后面添加下面代码:
- CString result1;
- result1 = (const char *)Reader->RPCResult->text;
- AfxMessageBox(result1);