先抄一段介绍性的话:gSOAP是一个绑定SOAP/XML到C/C++语言的工具,使用它可以简单快速地开发出SOAP/XML的服务器端和客户端。由于 gSOAP具 有相当不错的兼容性,通过gSOAP,我们就可以调用由Java, .Net, Delhpi, PHP等语言开发的SOAP服务,或者向它们提供SOAP服务。
据说这个很牛逼,但是对于中文字符的支持并不好,所以现在项目转到用SOAP来实现,也在学习中。有用过的大侠们么,加我QQ378717567~
现在现在网上转帖一篇帖子,
2 | 建立c#的webservice,建立asp.net的web服务工程,写入代码,过程之前的文档写过,这里不再重复。代码如下: |
using System; | |||||||||||||
using System.Collections.Generic; | |||||||||||||
using System.Linq; | |||||||||||||
using System.Web; | |||||||||||||
using System.Web.Services; | |||||||||||||
/// <summary> | |||||||||||||
/// WebService の概要の説明です | |||||||||||||
/// </summary> | |||||||||||||
[WebService(Namespace = "http://tempuri.org/")] | |||||||||||||
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] | |||||||||||||
// この Web サービスを、スクリプトから ASP.NET AJAX を使用して呼び出せるようにするには、次の行のコメントを解除します。 | |||||||||||||
// [System.Web.Script.Services.ScriptService] | |||||||||||||
public class WebService : System.Web.Services.WebService { | |||||||||||||
public WebService () { | |||||||||||||
//デザインされたコンポーネントを使用する場合、次の行をコメントを解除してください | |||||||||||||
//InitializeComponent(); | |||||||||||||
} | |||||||||||||
[WebMethod] | |||||||||||||
public string HelloWorld() { | |||||||||||||
return "Hello World"; | |||||||||||||
} | |||||||||||||
[WebMethod(Description = "计算a+b=sum的功能")] | |||||||||||||
public int Add(int a, int b) | |||||||||||||
{ | |||||||||||||
return a + b; | |||||||||||||
} | |||||||||||||
[WebMethod(Description = "显示问候语的功能")] | |||||||||||||
public string Show(string yourname) | |||||||||||||
{ | |||||||||||||
return "popular" + "欢迎" + yourname; | |||||||||||||
} | |||||||||||||
[WebMethod(Description = "AddNumbers")] | |||||||||||||
public string AddNumbers(string NumberOne, string NumberTwo) | |||||||||||||
{ | |||||||||||||
return "value:"+NumberOne+" "+NumberTwo;//NumberOne + NumberTwo + "hehe"; | |||||||||||||
} | |||||||||||||
} | |||||||||||||
3 | 客户端将来需用到wsdl文件,这里用到的是.net的webservice | ||||||||||||
在.NET中三种方式生成WSDL的方法 | |||||||||||||
1.在Web Service的URL后面加上WDSL需求,如下: | |||||||||||||
http://localhost/webExamples/simpleService.asmx?WSDL | |||||||||||||
2.使用disco.exe。在命令行中写下如下的命令: | |||||||||||||
disco http://localhost/webExamples/simpleService.asmx | |||||||||||||
3.使用System.Web.Services.Description命名空间下提供的类 | |||||||||||||
这里我只是用第一种方法 | |||||||||||||
4 | 开始写客户端程序 | ||||||||||||
wsdl2h -o outfile.h(为自己任意起的头文件) infile.wsdl(提供的wsdl文件) | |||||||||||||
如果用生成纯C的代码,需要加编译选项-c | |||||||||||||
wsdl2h -c -o outfile.h(为自己任意起的头文件) infile.wsdl(提供的wsdl文件) | |||||||||||||
根据生成的outfile.h文件,用工具soapcpp2 outfile.h生成构架代码 | |||||||||||||
如果用生成纯C的代码,需要加编译选项-c | |||||||||||||
soapcpp2 -c outfile.h生成构架代码 | |||||||||||||
注意:在编译的过程中会提示找不到文件stlvector.h,你需要在gsoap\import下把这个文件拷贝过来。 | |||||||||||||
1) | 用到第三步的第一个方法 | ||||||||||||
wsdl2h -o gjl.h http://localhost:4197/WebSite7/WebService.asmx?wsdl | |||||||||||||
2) | 编译刚才生成的gjl.h | ||||||||||||
soapcpp2 -c gjl.h | |||||||||||||
结果图 | 图没全截,大致如下 |
3) 根据 2)编译后生成的文件中,做为客户端需包含如下文件: | ||||||||||||||||||
soapC.cpp soapWebServiceSoapProxy.cpp stdsoap2.cpp soapH.h soapStub.h soapWebServiceSoapProxy.h stdsoap2.h WebServiceSoap.nsmap(这个文件根据wsdl不同而不同) | ||||||||||||||||||
stdsoap2.cpp等文件在gsoap安装目录的其他文件当中可找到 | ||||||||||||||||||
进行编译,出错请看红色 注意部分 |
4) | 开始写客户端代码 | |||||||||||||
#include "soapWebServiceSoapProxy.h" | ||||||||||||||
#include "WebServiceSoap.nsmap" | ||||||||||||||
#include<string> | ||||||||||||||
void main() | ||||||||||||||
{ | ||||||||||||||
WebServiceSoapProxy service; | ||||||||||||||
_ns1__HelloWorldResponse* xx=new _ns1__HelloWorldResponse; | ||||||||||||||
********************************************************插入代码 Start | ||||||||||||||
if (service.HelloWorld(NULL,xx)== SOAP_OK) | ||||||||||||||
{ | ||||||||||||||
std::cout<< "HelloWorld Result:" << *(xx->HelloWorldResult)<<"\n"; | ||||||||||||||
} | ||||||||||||||
else | ||||||||||||||
service.soap_stream_fault(std::cerr); | ||||||||||||||
_ns1__AddResponse* yy=new _ns1__AddResponse; | ||||||||||||||
_ns1__Add* par=new _ns1__Add; | ||||||||||||||
par->a=100; | ||||||||||||||
par->b=200; | ||||||||||||||
if (service.Add(par,yy) == SOAP_OK) | ||||||||||||||
{ | ||||||||||||||
std::cout<<"Add Result:"<< yy->AddResult<<"\n"; | ||||||||||||||
} | ||||||||||||||
else | ||||||||||||||
service.soap_stream_fault(std::cerr); | ||||||||||||||
//std::cout<< service.Add("http://localhost:4197/WebSite7/WebService.asmx","http://tempuri.org/Add",NULL,NULL); | ||||||||||||||
********************************************************插入代码 End | ||||||||||||||
} | ||||||||||||||
5) | 运行结构 |