2010-06-21 87 views
2

問題我有以下代碼,它調用.net web服務。代碼連接到服務正常,但參數(deviceid)似乎沒有通過。該方法簡單地返回始終爲空的傳遞的deviceid。將簡單字符串參數傳遞給.net webservice

這是告訴我deviceid參數沒有被傳遞。我以爲我看到有人推薦使用數據包嗅探器來查看傳出的XML,但似乎無法記住它是什麼。有人可以提出一個我可以與日蝕和窗口結合使用。

活動代碼

String deviceid = tManager.getDeviceId(); 

    SoapObject request = new SoapObject(NAMESPACE,METHOD_NAME); 

    PropertyInfo pi = new PropertyInfo(); 

    pi.setName("deviceid"); 
    pi.type = PropertyInfo.STRING_CLASS; 
    pi.setValue(deviceid.toString()); 
    request.addProperty(pi); 

    SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
    soapEnvelope.dotNet = true; 
    soapEnvelope.setOutputSoapObject(request); 

    HttpTransportSE ht = new HttpTransportSE(URL); 


    try{ 
     ht.call(SOAP_ACTION, soapEnvelope); 
     SoapPrimitive result = (SoapPrimitive) soapEnvelope.getResponse(); 


     Toast.makeText(ctx, "result = " + result.toString(), Toast.LENGTH_SHORT).show(); 

    }catch(Exception e){ 
     e.printStackTrace(); 
     Toast.makeText(ctx, "error: " + e.getMessage(), Toast.LENGTH_SHORT).show(); 

    } 

Web服務代碼

 <WebMethod()> _ 
    Public Function CheckTrial(ByVal deviceid As String) As String 

     Return deviceid 
    End Function 

我,試過一切,並不能找出如何解決這個問題。有沒有人有任何建議嘗試?

XML從電線鯊魚spy'ed發送:

POST /android_service_test.asmx HTTP/1.1 
Host: ikonicsoft.com 
user-agent: kSOAP/2.0 
soapaction: http://ikonicsoft.com/CheckTrial 
content-type: text/xml 
connection: close 
content-length: 421 
<?xml version="1.0" encoding="UTF-8"?> 
<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> 
    <CheckTrial xmlns="http://ikonicsoft.com" id="o0" c:root="1"> 
     <deviceid i:type="d:string">000000000000000</deviceid> 
    </CheckTrial> 
</v:Body> 
</v:Envelope> 

HTTP/1.1 200 OK 
Connection: close 
Date: Mon, 21 Jun 2010 16:35:10 GMT 
Server: Microsoft-IIS/6.0 
X-Powered-By: PleskWin 
X-Powered-By: ASP.NET 
X-AspNet-Version: 2.0.50727 
Set-Cookie: .ASPXANONYMOUS=fnyqjfFHywEkAAAAZGVjYjZmNTEtNWNiYi00YTIwLWEzYzktNzUxZDNjMDA0OGY00; 
expires=Mon, 30-Aug-2010 03:15:09 GMT; path=/; HttpOnly 
Cache-Control: private, max-age=0 
Content-Type: text/xml; charset=utf-8 
Content-Length: 299 

<?xml version="1.0" encoding="utf-8"?> 
<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> 
    <CheckTrialResponse xmlns="http://ikonicsoft.com/" /> 
</soap:Body> 
</soap:Envelope> 

感謝

帕特里克

+0

好吧,這似乎是微軟方面的問題。我可以將deviceid附加到像「deviceid =」&deviceid這樣的字符串,它將返回「deviceid =」,但不是實際傳遞的參數 – bugzy 2010-06-23 17:48:04

+0

我將此內容發佈到http://forums.asp.net的ASP.NET論壇。 /t/1571816.aspx – bugzy 2010-06-23 17:49:27

回答

1

如果我沒有記錯,ht.call(...)返回SoapSerializationEnvelope。我相信你需要拉你的迴應指出,信封以及不出來如果不工作,你在

SoapSerializationEnvelope responseEnvelope = ht.call(SOAP_ACTION, soapEnvelope); 
SoapPrimitive result = (SoapPrimitive) responseEnvelope.getResponse(); 

通過了一項: 您是否使用kso​​ap2爲Android(還有一個Java版本和Android版本)?你的web服務是否需要你登錄?當試圖執行類似的任務時,我發現ksoap沒有存儲會話cookie,特別是會話ID。我們必須extend ServiceConnection和HttpTransportSE將cookie保存爲字符串以便維護登錄

就數據包嗅探器而言,請檢查出wire shark

+0

我的理解是,響應會填充傳遞給ht.call()的soapEnvelope對象。我見過的所有示例代碼都顯示了這一點。 但是我做了你的建議,它不會編譯。錯誤是 類型不匹配:無法從void轉換爲SoapSerializationEnvelope 我正在使用android的ksoap2。該服務不需要任何登錄。我試圖保持簡單,直到我能弄明白爲止。 我必須檢查電線鯊魚。我想確認xml以確保它傳遞參數。 – bugzy 2010-06-21 15:42:40

+0

我不記得我頭頂的ht.call()的返回類型是什麼,但是我記得我把它存儲在我的變量「envelope」中。你的財產可能是你的問題的一部分。我根本沒有使用PropertyInfo類,而是我調用了addProperty(string,string)。 如果你想從wire shark發佈更多信息,那麼請看我是否可以提供幫助 – mtmurdock 2010-06-21 16:22:52

+0

好的,我在問題底部添加了Wire Shark的輸出。看起來deviceid正在發送。那麼爲什麼它不會被服務方法所接受。這可能是由於xml命名空間的差異。如果您查看服務描述(http://ikonicsoft.com/android_service_test.asmx),它使用而不是從ksoap2發送的內容 ??我仍然處於虧損狀態。 webservice nat able top是否正確解析傳入的xml? – bugzy 2010-06-21 17:25:22

0

嘗試設置PropertyInfo對象的名稱空間。

pi.setNamespace(NAMESPACE); 
+0

感謝您的建議,但沒有去。我第一次嘗試這 pi.setNamespace(「肥皂」);這產生這樣的: 然後我試圖 pi.setNamespace(NAMESPACE); (http://ikonicsoft.com)和生產: 是否有任何方法可以編程方式更改信封使用的是什麼而不是 thx – bugzy 2010-06-21 19:51:59

+0

命名空間是唯一的字符串。在上例中,不是問題,只要v引用正確的命名空間字符串即可。這裏v只是一個別名。 XML解析器將負責將v解析爲正確的名稱空間字符串。 爲了使您的Web服務(在服務器上)瞭解名稱空間引用,SOAP請求(來自Android)中的「所有」名稱空間引用應與您的WSDL中定義的名稱空間匹配。 您是否可以從非Android客戶端調用服務? – 2010-06-21 20:09:09

+0

我還沒有測試另一個客戶端,然後在我的本地主機上進行http post測試。 當你說'全部'命名空間,你的意思是http://tempuri.org命名空間,或者在我的情況下,我已經將其更改爲http://ikonicsoft.com – bugzy 2010-06-21 21:30:53

0

嘗試刪除冒號(:)從web服務命名空間...即只讓ikonicsoft.com代替http://ikonicsoft.com - 和更新您的肥皂參考通話以及使用新的命名空間。這很瘋狂,但這解決了我的問題(在黑莓手機上,但我認爲應用相同的原則)。

編輯 - 如果您嘗試使用您不屬於自己的Web服務,這並不理想,但它至少是一個消費自己的Web服務的解決方案。我對於爲什麼冒號混淆了事情感到十分困惑,但我注意到直接在Web服務器上執行一個HTML post(通過telnet到web服務器上的80端口),我得到了同樣的錯誤。

+0

嘿,謝謝瑞安。我會毫不猶豫地試一試。 – bugzy 2010-07-23 13:32:58

+0

另一件需要仔細檢查的地方是你的命名空間中有斜槓......即:如果它在你的web服務中定義爲'http:// ikonicsoft.com /',請確保你有'http:// ikonicsoft .com /'在你的java代碼中,而不是'http:// ikonicsoft。com' - 我也犯了這個錯誤,它適用於不帶參數的調用,但不適用於帶參數的調用。 – WearySky 2010-08-13 14:36:56