在 VS2008 下使用 WebService

今天有个朋友在 QQ 上联系我,说有个问题让我看看,找出里面的问题。题目是:

=====================================


    //创建连接到web服务
    WebService::CWebService * web = new WebService::CWebService ;

        BSTR * bstr;
 
        //省略部份代码

    CComBSTR bstr_key = strkey.AllocSysString();
    CComBSTR bstr_text = strText.AllocSysString();
 
        //省略部份代码

    //反查IP,参数(用户密钥,IP或域名地址,BSTR指针,数组长度)
    if(  web->ReverseIP( bstr_key , bstr_text  ,&bstr,&len ) == S_OK )
    {

        //省略部份代码


             for   (int   i=0;i <  len;i++)  
             {  
                  CComBSTR domain = *(bstr++) ;
                  m_listbox.AddString(  (LPCTSTR)domain  ); //m_listbox是一个列表控件
                 
             }  
         }

    delete web;
=====================================

 

就是这样,这就是我写这篇博客的由来。

 

 

看里面的关键词 "WebService",吸引了我的注意力,因为这个领域我不曾涉足,虽然之前带过的项目组里面,核心业务系统需要和银行业务系统交互,使用的就是 WebService。但是由于除了这个银保通模块之外,还有诸多模块,每个模块的事情都多的要死,所以一个一个模块全了解是不可能的,再加上以前的系统用的也是 J2EE,没有基于 C++ 和 dotNET 的。所以这引起了我的兴趣,我决定研究一下。

 

开始之前,先了解一下 WebService 的几个基本概念:

I、什么是 WebService

     Web Service 是具备下列特性的组件:
     1.它通过一个SOAP(Simple Object Access Protocol)接口被访问
     2.它的接口定义在一个WSDL (Web Service Description Language)文档里。


     SOAP是 Web Services的根本。它是一种具有扩展性的XML消息协议。SOAP提供了一个应用程序向另一个应用程序发送XML消息的简单而一致的机制。一个SOAP消息是从SOAP发送者传至SOAP接收者的单路消息,任何应用程序均可作为发送者或接收者。SOAP能够支持许多通讯行为,包括请求/响应(request/resposne)、solicit response、单路异步消息,甚至简单讯息(notification)。SOAP是一个仅定义消息结构及一些消息处理规则的高层协议。它完全与底层的协议独立,因此SOAP消息能通过HTTP、JMS或邮件通讯协议来传输。但在当前,通常使用HTTP协议来传送SOAP消息。

     WSDL是一份包含Web Service描述信息的XML文档,它包含了访问和使用一个Web Service所需要的所有信息,包括这个Web Service的功能、怎样与其通信及它的位置。在开发阶段,你使用WSDL文档创建你的服务接口。一些SOAP的实现(包括Systinet WASP)会在运行时使用WSDL支持动态通信。

 

 II、WebService 的特性:

1.由于 WebService 经由web服务器发布,所以比DCOM而言,可以顺利穿过防火墙。这也是 WebService 的优点之一,可以说, WebService ,为分布 式应用的开发,提供了一个很好的平台。

2.对 WebService 的调用,是通过SOAP协议进行的。简单对象访问协议(SOAP)提供了标准的远程过程调用(RPC)方法来调用Web service。 而SOAP也是基于XML和XSD的,XML是SOAP的数据编码方式,因此,对 WebService 的调用也可以是跨平台的。

 

了解了基本概念,下面我将用 Visual Studio 来创建基于 dotNET 托管的 WebService 程序。因为 Visual Studio 内建提供了对 WebService 的调用。在 VC 中,调用 WebService 只需要简单的几个步骤即可。只要找到 WebService 的发布 地址,将地址引入到VC工程中。这时,编译器会预先编译一次,自动生成和 WebService 相关的头文件(也可以叫Web代理文件) WebService .h。 在你的程序中,包含 WebService .h然后生成相关的对象,就可以对远程的 WebService 进行调用了。

 

下面开工:使用 VS2008 创建一个基于 CDialog 的应用程序(命令行单文档多文档也无所谓,都行),这没啥好说的,谁都会。创建完成之后,从解决方案资源管理器中为工程添加 Web 应用。如图:

 

图片1

可是看高亮的菜单项下面,我们需要的“添加 Web 引用”是灰色的,没办法添加。怎么办?于是查了一下才知道,VS2003、VS2005 默认托管,而 VS2008 默认关闭了,所以需要更改工程的属性,需要 dotNET 托管才可以,把项目属性这里的设置改成这样:

 

图片2

 

改成 clr 支持,这样,确定之后再次添加 web 引用:

 

图片3

 

菜单就变成可用的了。于是点开此菜单

输入网址,点“前往”,于是 VisualStudio 打开该链接寻找服务描述,找到之后下面会默认一个“Web 引用名”,可以修改,也可以默认,我就懒得改了,保留默认值,直接点“添加引用”就是了。接着硬盘灯一顿狂闪,等这个世界清静下来的时候,VisualStudio 告诉我已经为我生成好了响应的描述文件:WebService.h、com_ip866www.h、... 等等,到这里前期工作都已经完成了,接下来就是要调试那一段代码,让它可以跑起来。

为了测试方便,我就直接把那一段代码加在 OnInitDialog 里面了。按 F5 编译运行,出来一堆红叉叉,什么什么没有声明,什么什么不能转换之类,于是一个个修改,最后的代码是这样:

 

=====================================

 

    //创建连接到IP866的web服务
    #pragma push_macro("new")
    #undef new
        com_ip866www::WebService ^web = gcnew com_ip866www::WebService;
    #pragma pop_macro("new")

 

    //省略部份代码
    CString strkey, strText;
    // ReverseIP”: 函数不接受 4 个参数

    CComBSTR bstr_key = strkey.AllocSysString();
    CComBSTR bstr_text = strText.AllocSysString();

    String ^sTestKey = gcnew String(strkey);
    String ^sTestText = gcnew String(bstr_text);

    //省略部份代码

    //反查IP,参数(用户密钥,IP或域名地址,BSTR指针,数组长度)
    if(  web->ReverseIP( sTestKey , sTestText))

    {

        //...

    }

=====================================

 

从语法上来讲,编译运行是没有问题了。

主要错误有:1、一些变量没有声明,比如原始代码里面的 strkey、strText、len 等;

                  2、从 CComBSTR 到 dotNET 托管的 System::String 需要做转换;

                  3、接口里面 ReverseIP 只有两个参数,并且返回的是数组类型。需要去掉后两个参数和返回值比较 S_OK。

 

不过至于核心功能方面,由于那个 WebService 提供的接口 ReverseIP 不清楚里面具体是要实现个什么逻辑,所以还需要明确之后进一步再确定代码如何调整了。

到此先暂告一段落吧。

 

 

 

 

参考资料:

1、http://msdn.microsoft.com/zh-cn/library/ms169816.aspx

2、http://myvc.blog.ccidnet.com/blog-htm-do-showone-uid-264170-itemid-1337261-type-blog.html

3、http://tech.163.com/06/0428/09/2FPMSA1L00091LRC.html

4、http://yelixing.spaces.live.com/blog/cns!3F2FD980C7DFBF2B!143.entry

5、http://www.vckbase.com/document/viewdoc/?id=1696

 

 

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值