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


    作者:朱金灿

    来源: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); 

     

     

  • 相关阅读:
    8 Django 模型层(1)
    7 Django的模板层
    Java ClassLoader
    Spring的注入注解
    Java 面试Spring的加载机制
    Spring容器启动初始化bean的方法
    java 线程
    经典博客
    Spring注解@Component、@Repository、@Service、@Controller区别
    java 实现多个文件的Zip包的生成
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6471180.html
Copyright © 2020-2023  润新知