当使用纯C客户端访问WCF服务时,最麻烦之处在于编写soap消息。如果单纯借助于字符串操作,则既费时又费力,还非常容易出错,因此必须采用更适合的手段。纯C的soap toolkit在sf上找到了csoap(
http://sourceforge.net/projects/csoap/?source=directory),试用后发现有很大的局限性,虽然用户面对更少的xml细节,但无法完全按照想要的方式构建soap消息,主要体现在对Envelope/Header无法修改上。后又学习了gSoap(
http://sourceforge.net/projects/gsoap2/),这是一个重量级的soap/wsdl框架,适用于从wsdl开始访问web service的方式(
https://www.ibm.com/developerworks/cn/webservices/ws-soa-gsoap/),与本文的需求并不一致,遂作罢。重新梳理了一下,其实soap消息无非一个普通的xml格式文本,头部加上几行固定的字符串,核心问题还是xml解析。于是决定用最基本的libxml(
http://xmlsoft.org/),w3c官方的工具,专治xml,至于多出的soap部分,copy&paste呗。libxml首先是个纯c的框架,其次解决底层的问题绰绰有余,另外足够简单。所以,应该找不出更好的办法了。
首先,利用libxml按指定格式构建一个xml文件,比如:
该xml文件的树形结构如下图所示:
首先,利用libxml按指定格式构建一个xml文件,比如:
<?xmlversion="1.0" ?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
<a:Action s:mustUnderstand="1">http://tempuri.org/IMathService/echo</a:Action>
<a:To s:mustUnderstand="1">http://127.0.0.1:9998/MathService</a:To>
</s:Header>
<s:Body>
<echo xmlns="http://tempuri.org/">
<input>123</input>
</echo>
</s:Body>
</s:Envelope>
该xml文件的树形结构如下图所示: