在Android中調用KSOAP2庫訪問webservice服務出現的服務端傳入參數為null的問題解決


      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服務對命名空間要求是要完全一致。

    網上很多查資料問問題的時候,常常直接給解決方法,但不說原因,往往大家按照提供的解決方法按部就班去做,但環境各不相同,有些人照着做了成功了,但總有人照着做了就是不行,比如網上提供的第三個解決方法,多說一句命名空間必須保證一致,這樣就大家不用糾結添加“/”的這個細節問題了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM