桌面程序调用Web Service应用实例

作者:朱金灿

来源:blog.youkuaiyun.com/clever101

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

最近做一个项目,需要使用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.0XP上安装IIS 5.0Server 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方法(实际上就是被远程调用的那个函数,实现两个字符串相加,输出结果字符串):

  1. [WebMethod]
  2. publicstringStringsAdd(stringstrLeft,intstrRight)
  3. {
  4. returnstrLeft+strRight;
  5. }

然后单击菜单上的“生成解决方案”,按F5调试运行,页面如下:

可以看到上面已经有了一个StringsAdd的链接,单击进去,可以看到里面有两个输入参数框和一个调用按钮,如下图:

下面我们使用VC++ 6.0建一个对话框程序CallWebMethod来调用这个WEB方法,界面如下:

  1. //注意组件的位置根据自己的系统环境来取得
  2. #import"msxml4.dll"
  3. usingnamespaceMSXML2;
  4. #import"C:/ProgramFiles/CommonFiles/MSSoap/Binaries/MSSOAP1.dll"/
  5. exclude("IStream","IErrorInfo","ISequentialStream","_LARGE_INTEGER",/
  6. "_ULARGE_INTEGER","tagSTATSTG","_FILETIME")
  7. usingnamespaceMSSOAPLib;

同时定义对话框类三个成员变量:

  1. ISoapSerializerPtrSerializer;
  2. ISoapReaderPtrReader;
  3. ISoapConnectorPtrConnector;

2. 在按钮消息命令函数加入如下代码:

  1. voidCCallWebMethodDlg::OnBtnCallweb()
  2. {
  3. //TODO:Addyourcontrolnotificationhandlercodehere
  4. CoInitialize(NULL);
  5. //与Web服务连接
  6. Connector.CreateInstance(__uuidof(HttpConnector));
  7. //http://localhost/MyWeb/Service.asmx?op=StringsAdd为调用页面
  8. Connector->Property["EndPointURL"]="http://localhost/MyWeb/Service.asmx?op=StringsAdd";
  9. Connector->Connect();
  10. //开始消息,http://tempuri.org/StringsAdd为响应函数,
  11. Connector->Property["SoapAction"]="http://tempuri.org/StringsAdd";
  12. Connector->BeginMessage();//启动消息句柄
  13. //创建SoapSerializer对象
  14. Serializer.CreateInstance(__uuidof(SoapSerializer));
  15. //将serializer连接到connector的输入字符串
  16. Serializer->Init(_variant_t((IUnknown*)Connector->InputStream));
  17. //////////////////////
  18. //创建SOAP消息
  19. Serializer->startEnvelope("","","");
  20. Serializer->startBody("");
  21. //找到WEB函数名
  22. Serializer->startElement("StringsAdd","http://tempuri.org/","","");
  23. //找到第一个参数
  24. Serializer->startElement("strLeft","http://tempuri.org/","","");
  25. //输入第一个参数值
  26. Serializer->writeString("Hello,");
  27. Serializer->endElement();
  28. //找到第二个参数
  29. Serializer->startElement("strRight","http://tempuri.org/","","");
  30. //输入第二个参数值
  31. Serializer->writeString("World!");
  32. Serializer->endElement();
  33. Serializer->endElement();
  34. Serializer->endBody();
  35. Serializer->endEnvelope();
  36. //将该消息发送给web服务
  37. Connector->EndMessage();//将消息送往服务器
  38. //读取响应
  39. Reader.CreateInstance(__uuidof(SoapReader));
  40. //将reader联接到connector的输出字符串
  41. Reader->Load(_variant_t((IUnknown*)Connector->OutputStream),"");
  42. //显示结果
  43. AfxMessageBox((constchar*)Reader->Body->xml);//以xml格式输出
  44. }

其中SoapAction 参数值可以通过以下方式获取:

http://localhost/MyWeb/Service.asmx?wsdl然后按回车,如下图所示:

程序运行结果如下图,可以看到“Hello,World!”的输出:

如果你想单纯输出Hello,World!,可以在函数后面添加下面代码:

  1. CStringresult1;
  2. result1=(constchar*)Reader->RPCResult->text;
  3. AfxMessageBox(result1);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值