注:转载请注明出处,请保持文章的完整性。
这个问题很麻烦,折腾了一段时间了,仍未最终解决所有问题。在未解决之前,我会一直关注它。
如果要说这个问题的关键词,那就是:gsoap,client,WCF,interoperability。即gsoap C++客户端与WCF服务端的互操作性问题。
麻烦在这两个平台用Web Service交互时,可能的组合太多,而我所使用的组合遇到的问题在网上可以找到的答案甚少,所以这些天来非常纠结。
我所面临的情况就是:服务端使用SOAP 1.2,在Windows下用C#开发;客户端使用跨平台的gsoap开发包(版本为2.7.15),在Linux下使用C++开发。
个中遇到的问题太多,有些解决了,有些仍然不知如何解决,我会在有时间的时候逐渐地写上来。
(1)证书问题。
当Web Service使用SSL/HTTPS进行通信时,跨平台的证书问题怎么处理?如果你对证书非常了解,那么没问题,你可以在十几分钟内就搞定它。但是如果你根本就不知道”自签名的证书“是怎么一回事的话,那就有得受了。证书还牵涉到你所使用的SOAP开发包,因为不同的开发包要求使用的证书格式也不同。例如,gsoap就要用pem格式的证书文件。这个文件怎么得到?自签名的证书又是怎么一回事?它跟Web Service有什么关系?这个真不是一两句话就可以说得清楚的,恐怕要从”Web Service是什么“来说起了。但是我也不可能长篇大论地打几万字上来,所以有些基础的概念还是请您自己挪步google吧。
(2)SOAP 1.1/1.2的兼容性问题。
当服务端和客户端使用的SOAP版本不同时,能不能配合上?我没有试过,当然,我的直接想法就是:服务端用哪个版本,客户端就用哪个版本的SOAP,所以事先双方最好确定一下各自的版本。但是就算是同一版本,由于服务端和客户端不是同一平台的,也有可能出问题。例如,我的Web Service服务端使用SOAP 1.2,我使用gsoap做的client死活就是无法调用它。这个问题还没解决,但是我说一下其中的几个问题。
一是HTTP header中的SOAPAction的问题。使用gsoap开发,可以生成调试信息,把发送的HTTP头信息及XML数据保存到文件中(默认文件名为“SENT.log”,文件名可以在运行时(runtime)来修改),打开它,可以看到有用的调试信息,以帮助你确定问题所在。gsoap 2.7.15的pdf文档里写得很清楚,soapcpp2默认生成的代理类是SOAP 1.1的,如果要生成SOAP 1.2的,请使用-2参数,但是在某个国外的技术论坛中,我看到一些人说-2参数有时候是无效的(这种说法未经证实),到底是SOAP 1.1还是SOAP 1.2,其实是由.nsmap文件来控制的。.nsmap文件保存的是XML命名空间表,该文件是soapcpp2编译器生成的。
(未完,待续)