http://blog.163.com/yzb_mq/blog/static/2408156201022383927658/
接(二)
5、方便其它平台调用Web Service服务所需要做的工作:
以上的C和C++版本的Web Service服务端运行后,在本机或者其它机(windows系统也一样)浏览器中输入http://192.168.1.88:9000/SmsWBS?wsdl,会返回XML文件内容,但是并无Web Service的功能函数描述,原因是尚未实现允许客户端通过http的get操作来获取 SmsWBS.wsdl文件。因此,需要补充实现这一部分,以C++版本为例,完善后的SmsWBSserver.cpp程序是:
#include "soapSmsWBSService.h"
#include "SmsWBS.nsmap"
int http_get(struct soap * soap);
int main(int argc, char **argv)
{
SmsWBSService sms;
if (argc < 2)
sms.serve(); /* serve as CGI application */
else
{
int port = atoi(argv[1]);
if (!port)
{
fprintf(stderr, "Usage: SmsWBSserver++ <port>\n");
exit(0);
}
/* run iterative server on port until fatal error */
sms.fget = http_get;
if (sms.run(port))
{
sms.soap_stream_fault(std::cerr);
exit(-1);
}
}
return 0;
}
int SmsWBSService::add(int num1, int num2, int *sum)
{
*sum = num1 + num2;
return SOAP_OK;
}
//能够远程读取wsdl文件
int http_get(struct soap * soap)
{
FILE *fd = NULL;
char *s = strchr(soap->path, '?');
if (!s || strcmp(s, "?wsdl"))
return SOAP_GET_METHOD;
fd = fopen("SmsWBS.wsdl", "rb");
if (!fd)
return 404;
soap->http_content = "text/xml";
soap_response(soap, SOAP_FILE);
for (;;)
{
size_t r = fread(soap->tmpbuf, 1, sizeof(soap->tmpbuf), fd);
if (!r)
break;
if (soap_send_raw(soap, soap->tmpbuf, r))
break;
}
fclose(fd);
soap_end_send(soap);
return SOAP_OK;
}
重新将服务端编译,运行后http://192.168.1.88:9000/SmsWBS?wsdl能够获取到完整的SmsWBS.wsdl。
至此,可以在windows下的VC++.Net项目中通过“添加WEB 引用”来方便地生成客户端类文件,从而调用Web Service服务端的功能。
(全文完)