Chinaunix首页 | 论坛 | 博客
  • 博客访问: 298290
  • 博文数量: 63
  • 博客积分: 814
  • 博客等级: 军士长
  • 技术积分: 700
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-09 15:46
文章分类

全部博文(63)

文章存档

2017年(1)

2016年(4)

2015年(13)

2014年(9)

2012年(3)

2011年(33)

分类: WINDOWS

2011-07-13 14:34:17

    工作中需求隔离数据库访问,提供给客户数据查询功能,故想到webservice。开发一直是c/c++,对webservice 不了解,查找到资料后,决定用gsoap 实现。

    下载gsoap 2.8.3,参看http://www.cppblog.com/qiujian5628/archive/2010/03/22/54019.html,并进行了代码测试,利用gsoap 下的sample 代码calc。
    前提找到calc.h文件,修改成本机运行的代码,找到这几行注释,把后面的值改成下面所示。别看是注释这几行很重要,后面的soapcpp2 命令会根据这几行生成相关的代码。
  1. //gsoap ns service name: calc
  2. //gsoap ns service style: rpc
  3. //gsoap ns service encoding: encoded
  4. //gsoap ns service namespace: http://localhost/calc.wsdl
  5. //gsoap ns service location: http://localhost

  6. //gsoap ns schema namespace: urn:calc
找到calcserver.c文件,加入如下函数
  1. int http_get(struct soap *soap)
  2. {
  3.     FILE*fd = NULL;
  4.     fd = fopen("../server/calc.wsdl", "rb"); //open WSDL file to copy
  5.     if (!fd)
  6.     {
  7.         return 404; //return HTTP not found error
  8.     }
  9.     soap->http_content = "text/xml"; //HTTP header with text /xml content
  10.     soap_response(soap,SOAP_FILE);
  11.     for(;;)
  12.     {
  13.         size_t r = fread(soap->tmpbuf,1, sizeof(soap->tmpbuf), fd);
  14.         if (!r)
  15.         {
  16.             break;
  17.         }
  18.         if (soap_send_raw(soap, soap->tmpbuf, r))
  19.         {
  20.             break; //cannot send, but little we can do about that
  21.         }
  22.     }
  23.     fclose(fd);
  24.     soap_end_send(soap);
  25.     return SOAP_OK;
  26. }
在soap_init(&soap)下加入此行
  1. soap_init(&soap);
  2.   soap.fget = http_get;
 现在可以开始了。   
 一、 C 实现服务端和客户端
   1.建三个目录,client,server,tmp。后把gsoap 目录下stdsoap.c stdsoap.h都拷一份到二个目录下。把sample/calc/calcclient.c 拷到client下,sample/calc/calcserver.c拷到server 下。

    2.把gsoap 中的soapcpp2,修改好的calc.h 拷到tmp目录下,然后 命令执行soapcpp2 -c calc.h -x 生成一系列客户端和服务端需要的代码(-c  是生成c 代码,-x是不产生相关xml文件)。

    3.把生成的calc.nsmap soapC.c soapH.h soapClient.c soapstub.h 文件拷到client目录下,calc.nsmap soapC.c soapH.h soapServer.c soapstub.h拷到server下。还有二个***lib.c 文件不用关心。

     3.编译&运行。没错的话到此应编译通过。先运行服务端 server 8888

出现类似输出就OK了。
      4.检验服务端,上面会生成一个 add.wsdl,这是一个接口描述文件,跨语言访问最重要的一个文件了,上面http_get中有一行代码如下,wsdl文件就是在此用到,你需要找到路径。不然会有404错误。
  1. fd = fopen("../server/calc.wsdl", "rb"); //open WSDL file to copy
浏览器输入 应看到如下说明服务端运行正确。




运行客户端client a 7 8 回车


OK 服务调用正确。到此为此C 调用webservice 完成。

二、下面说说webservice 跨语言的调用 ,这里我用C# 实现客户端。

首先: VC 2008 建C#工程,win form。

利用右键菜单add service reference,输入 GO ,会找到相关的服务 calc.

在一按钮下click 事件中如下代码
  1. wsClient.Calc.calcPortTypeClient calc = new wsClient.Calc.calcPortTypeClient("calc","");
  2.             double c = calc.add(3, 4);

运行起来,可以看到c=7。 OK C#调用成功。

    写点小总结,现在基本了解webservice基本应用原理,所有工作也花了2-3天,其中遇到很多不解和困难,结合代码加上调试一个个的解决了问题。网上的资料不是很全,都较支离破碎,需要点耐心,所以写了此文章,当作自己的笔记,也希望能给予新手一点帮助。
   我的工作还没完成,到此是第一阶段完成,关于数据库的webservice 接口是下一步继续开展的工作。需要实现真正应用的webservice,肯定还会遇到相应的问题,若完成我也会把思路整理出来。
 
  



阅读(2934) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~