vc下用gsoap调用WCF

通常用gsoap调用webService,是没有什么问题的,

参考http://hi.baidu.com/lbird/blog/item/0222bb6eb2eb12d480cb4a50.html

       http://www.ibm.com/developerworks/cn/webservices/ws-soa-gsoap/index.html#resources


但是如果用gsoap调用WCF,就有问题了,和服务的和客户端soap的版本问题有关系,

详见下面的链接

http://social.msdn.microsoft.com/Forums/zh-SG/wcf/thread/1ff173ee-c371-45b1-986b-fbb67ea94de8

http://social.msdn.microsoft.com/Forums/zh-CN/wcf/thread/082a52ea-d705-42c7-9305-3a5f7eb52367


1:先用wsdl2h命令来生成C++头文件

wsdl2h -s -o cert.h

2:再用soapcpp2生成代理文件

soapcpp2 -C -L -w -x -i -2 -a cert.h

3:生成的文件的有6个

....namap 、...Proxy.cpp、...Proxy.h、soapC.cpp 、soapH.h、soapStub.h

以下是简要说明:

【 ...namap 命名空间

    ...Proxy.cpp、...Proxy.h 代理类\头文件

    soapC.cpp 、soapH.h 指定数据结构的序列化器和反序列化器、从输入 Header 文件生成的经过修改且带标注的 Header 文件 

   soapStub.h   从输入 Header 文件生成的经过修改且带标注的 Header 文件

 】

4:用VS2005 或者VC6.0(没有试过)j将上面的文件引入工程,还有gsoap下的stdsoap2.cpp和stdsoap2.h,

5:也是最重要的一步,修改命名空间

For removing soap 1.2 namespace from the your web-service client project you should to change strings

 {"SOAP-ENV", "http://www.w3.org/2003/05/soap-envelope", "http://www.w3.org/2003/05/soap-envelope", NULL},
 {"SOAP-ENC", "http://www.w3.org/2003/05/soap-encoding", "http://www.w3.org/2003/05/soap-encoding", NULL},
 {"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance", NULL},
 {"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema", NULL},

to 

{"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/", NULL, NULL},
 {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/", NULL, NULL},
 {"xsi", "http://www.w3.org/2001/XMLSchema-instance", NULL, NULL},
 {"xsd", "http://www.w3.org/2001/XMLSchema", NULL, NULL},

in your .nsmap file and *Proxy.cpp file.

The above three lines tells the client to send SOAP message with version 1.1 instead of the default generated message version 1.2

6:代理类当做普通类,进行函数调用就可以了,如果返回值不是SOAP_OK,可以用soap_sprint_fault函数进行输出!

       _ns3__GetChar ns3 ;
_ns3__GetCharResponse ns3Res;
BasicHttpBinding_USCOREIWebLogProxy webLog ;


int nRet = webLog.GetChar(NULL,NULL,&ns3,&ns3Res);
if (nRet == SOAP_OK)
{
AfxMessageBox("ok");
}
else
{
CString str ;
char szMsg[255]={0};
webLog.soap_sprint_fault(szMsg,255);
str.Format("return = %s",szMsg);
AfxMessageBox(str);
}


你可能感兴趣的:(数据结构,webservice,header,null,SOAP,WCF)