现在的位置: 首页 > 综合 > 正文

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

2012年03月22日 ⁄ 综合 ⁄ 共 3612字 ⁄ 字号 评论关闭

作者:朱金灿

来源: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.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.     public  string StringsAdd(string strLeft,int strRight)
  3.     {
  4.          return strLeft + strRight;
  5. }

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

 

      

 

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

 

   

 

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

 

   

 

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

 

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

 

 

  1.     ISoapSerializerPtr Serializer; 
  2.     ISoapReaderPtr Reader; 
  3.     ISoapConnectorPtr Connector;

 

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

 

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

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

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

 

        

 

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

 

         

 

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

 

  1. CString result1;
  2.     result1 = (const char *)Reader->RPCResult->text;
  3. AfxMessageBox(result1); 

 

 

抱歉!评论已关闭.