分析過程:
用soap toolkit的跟蹤工具M(jìn)SSoapT看一下,客戶端到底向WebService發(fā)送了什么數(shù)據(jù):
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="" xmlns:SOAP-ENV="http://schemas./soap/envelope/">
<SOAP-ENV:Body SOAP-ENV:encodingStyle=""> <SOAPSDK1:Add
xmlns:SOAPSDK1="http:///"
SOAP-ENV:encodingStyle=""> <n1
SOAP-ENV:encodingStyle="">5</n1> <n2
SOAP-ENV:encodingStyle="">10</n2>
</SOAPSDK1:Add> </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
再看看vs.NET調(diào)試中,IE瀏覽器發(fā)出的數(shù)據(jù)(模板):
<?xml version="1.0" encoding="utf-8"?> <soap:Envelope
xmlns:xsi="http://www./2001/XMLSchema-instance"
xmlns:xsd="http://www./2001/XMLSchema"
xmlns:soap="http://schemas./soap/envelope/">
<soap:Body> <Add xmlns="http:///">
<n1>int</n1> <n2>int</n2>
</Add> </soap:Body> </soap:Envelope>
區(qū)別在哪里?soaptoolkit的數(shù)據(jù)中,多了個(gè)encodingStyle屬性,盡管沒有制定值。我們想辦法屏蔽這個(gè)屬性。
在SoapSerializer30的startElement方法中的參數(shù)中按照如下方式調(diào)用,可以不制定這個(gè)屬性。 改代碼如下:
... Serializer->startElement("Add","http:///","NONE","");
Serializer->startElement("n1","","NONE","");
Serializer->writeString("5"); Serializer->endElement();
Serializer->startElement("n2","","NONE","");
Serializer->writeString("10"); Serializer->endElement();
Serializer->endElement(); ...
但返回結(jié)果還是0,看來和encodingStyle無關(guān)??纯锤櫱闆r:
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="" xmlns:SOAP-ENV="http://schemas./soap/envelope/">
<SOAP-ENV:Body SOAP-ENV:encodingStyle=""> <SOAPSDK1:Add
xmlns:SOAPSDK1="http:///">
<n1>5</n1> <n2>10</n2>
</SOAPSDK1:Add> </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
問題解決: 比較一下vs.net中發(fā)出的請求,差別在哪里?認(rèn)真看一下,n1和n2沒有指定命名空間,那么就指定一下吧。
把代碼改成:
Serializer->startElement("Add","http:///","NONE","");
Serializer->startElement("n1","http:///","NONE","");
Serializer->writeString("5"); Serializer->endElement();
Serializer->startElement("n2","http:///","NONE","");
Serializer->writeString("10"); Serializer->endElement();
Serializer->endElement();
測試結(jié)果正常了,返回15。
看看這時(shí)候發(fā)出的xml數(shù)據(jù): <SOAP-ENV:Envelope SOAP-ENV:encodingStyle=""
xmlns:SOAP-ENV="http://schemas./soap/envelope/">
<SOAP-ENV:Body SOAP-ENV:encodingStyle=""> <SOAPSDK1:Add
xmlns:SOAPSDK1="http:///">
<SOAPSDK1:n1>5</SOAPSDK1:n1>
<SOAPSDK1:n2>10</SOAPSDK1:n2>
</SOAPSDK1:Add> </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
原因:
也許是VS.NET的問題,也許是SoapToolKit的問題,也許是他提供的例子自身就有問題,也許是我的運(yùn)行環(huán)境有問題,當(dāng)然,更也許是我還沒有真正理解xml的命名空間或沒有正確使用WebService。
|