ksoap2-android-3.0.0-jar 第三方庫來調用.net 寫的Web Service 如果沒有參數,那么調用一切順利,但是如果服務是帶參數的,那么服務端接收的參數都是nul。
而Web Service單獨測試,都是正確的。這個問題困擾我了很久,現在終於解決了,相當簡單。百度查了很久,很多解決方法,如:
1、只需要在 WebService的類屬性中加入SoapRpcServiceAttribute屬性就可以了。
[SoapRpcService(RoutingStyle=SoapServiceRoutingStyle.SoapAction)]
2、參數名必須跟webservice方法中的參數名一致,因為ws將參數名自動改為了arg0、arg1,所有調用時參數也需要修改。
3、NAMESPACE 后面沒有加“/”
經過逐一測試,發現按照1修改調用直接異常出錯,服務器端都直接拒絕了,按照2改沒有任何用處,至於3,我是加了“/”,但依然沒有用。但3對我有了個啟發,我仔細對比了下命名空間發現我的 WebService類屬性命名空間是這么命名的:http://tempuri.org。看到什么問題沒?和android端的命名空間對比發現少了“/”。
好吧,我承認我開始以為這個“/”說是加在android客戶端的,因為里面的actonSoap = NAMESPACE + Method,這樣命名空間空間后面“/”是必須可少的,不然就要寫成actonSoap = NAMESPACE + “/” + Method。
雖然加了“/”是成功了,但是原因呢?我們看下下面這位仁兄的代碼,他的問題依舊。
這位仁兄的帖子在http://bbs.csdn.net/topics/390554653,也不知道3年過去了他解決了沒,我們看具體的報文:
WebServiceStudio 調用的報文(服務端)
<?xml version="1.0" encoding="utf-16"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <soap:Body> <GetNewsListByColId xmlns="http://tempuri.org/"> <colId>29</colId> </GetNewsListByColId> </soap:Body> </soap:Envelope>
用Android調用報文(客戶端)
<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
<v:Header />
<v:Body> <GetNewsListByColId xmlns=" http://tempuri.org/" id="o0" c:root="1"> <colId i:type="d:string">29</colId> </GetNewsListByColId>14:55:50 </v:Body> </v:Envelope>
可以看到,具體格式不太一致,但其實本身不影響服務端解析的,這里真正影響的是命名空間,我紅色標出的,看到什么問題了嗎?都有“/”啊,為什么還出錯?!在仔細看看,原來客戶端命名空間http前面多了個空格!好吧,原來大家知道了吧,命名空間不一致!原因終於找到了,微軟C#端Webservice服務對命名空間要求是要完全一致。
網上很多查資料問問題的時候,常常直接給解決方法,但不說原因,往往大家按照提供的解決方法按部就班去做,但環境各不相同,有些人照着做了成功了,但總有人照着做了就是不行,比如網上提供的第三個解決方法,多說一句命名空間必須保證一致,這樣就大家不用糾結添加“/”的這個細節問題了。