2010-11-27 42 views
6

顯然這是一個相當經常遇到的問題。我不確定問題出在哪裏,或者需要調整什麼,但是對於我的生活,我無法從帶有參數的.NET XML Web服務的SoapObject或SoapPrimitive中檢索除NULL結果以外的任何內容。Android,KSoap2和.NET Web服務w/parameters = NULL結果

我嘗試了一切,我在網上發現:

  • 添加.setXmlVersionTag =無變化
  • 使用SoapObject代替SoapPrimitive =無變化
  • 使用SoapPrimitive代替SoapObject =沒有變化
  • 使用HttpTransportSE代替AndroidHttppTransport =無變化
  • 使用AndroidHttpTransport代替HttpTransportSE =無變化
  • 設置.dotNet =真=無變化
  • 卸下.dotNet分配線=無變化
  • 卸下結腸(整個HTTP://前綴)從web服務=無變化
  • 使用的PropertyInfo類,而不是直接賦值=無變化
  • 使用直接分配,而不是的PropertyInfo類=無變化

我在一個總損失這是相當令人沮喪。我完全控制了Web服務(我寫了它),所以稍作改動,如果有幫助,我願意嘗試。

目前如下我的代碼是這樣的:

public void GetResults() 
{ 
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
request.addProperty("lastName", "sm"); 
request.addProperty("middleName", ""); 
request.addProperty("firstName", ""); 
request.addProperty("pageSize", 25); 
request.addProperty("pageNumber", 1); 

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

//AndroidHttpTransport aht = new AndroidHttpTransport(URL); 
HttpTransportSE aht = new HttpTransportSE(URL); 

try 
{ 
    aht.setXmlVersionTag("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); 
    aht.call(SOAP_ACTION, soapEnvelope);   

    //SoapObject result = (SoapObject)soapEnvelope.bodyIn; 
    SoapObject result = (SoapObject)soapEnvelope.getResponse(); 
    //SoapPrimitive result = (SoapPrimitive) soapEnvelope.getResponse(); 
    //Object result = soapEnvelope.getResponse(); 

    Log.d("WS", String.valueOf(result));   
} 
catch(Exception e) 
{ 
    e.printStackTrace(); 
}  
} 

和我的全局是這樣的:

private static final String SOAP_ACTION = "http://yoda/SearchPerson"; 
private static final String METHOD_NAME = "SearchPerson"; 
private static final String NAMESPACE = "http://yoda/"; 
private static final String URL = "http://yoda/ws.asmx"; 

我知道「尤達」被正確地翻譯爲我的非參數化網絡serivce是像一個血腥的冠軍一樣工作。(除了'request.addProperty'調用之外,一切都是完全相同的,這些調用顯然是(部分或全部)手頭問題。)

如果很重要我正在使用KSoap2 2.5.2針對1.6目標平臺它在我所有不同的Android模擬器中的表現完全相同。

我用wireshark嗅探了數據包,模擬器看起來正在發送正確的東西,但它收到的結果始終爲NULL。 (我測試過這些確切的參數多次對我的測試網站,使用這些網絡服務,並在所有工作完美的地方。)

所以,任何人都可以在這裏扔我骨頭?

感謝,

Magua

編輯2010.11.28:

即使Wireshark是告訴我,我送參數它似乎是Web服務不接收他們正確,或類似的東西。我創建了一個全新的服務,假設返回一個簡單的字符串,無論第一個參數是什麼,最後都是「TEST」,從Web服務本身進行硬編碼。嗯,每次我運行這個(從Android)我都會得到一個結果,它總是「測試」。無論我如何制定SoapEnvelope或無論我通過什麼參數,我總是會收到「TEST」。當然,當我調用服務器上的Web服務時,它就像一個冠軍(我的結果是「這是一個測試」)。

我的web服務位於帶有IIS 7的Windows Server 2008上。應用程序池針對框架v2.0(不是v4.0)與「集成」託管管道模式運行。

我不知道斷開連接在哪裏。 KSoap2是否發送不正確的參數? IIS配置不正確?還有其他的東西嗎?

回答

7

哇。粉筆這一個到各種各樣的古怪和疏忽,但我已經修復它。

問題是在命名空間末尾丟失了尾部'/'。不是爲Android全局聲明的名稱空間,而是在Web Service自身上在service.asmx.cs文件頂部附近聲明的名稱空間。 (直接在WebServiceBinding之上)。

一旦我把它添加到最後,一切都像一個冠軍。

奇怪的是,這顯然隻影響參數的方法,因爲那些沒有參數的方法工作正常。只有使用KSoap2作爲我的網站才能使用完全相同的服務,這一切都是完美無缺的。

1

這可能不是您想要聽到的答案,但是,一般來說,如果我處於困境中,我會考慮從SOAP切換到REST風格的Web服務。

有批評SOAP漂浮的無數的文章(和WSDL和UDDI) - 你可能已經看到其中的一些,如123 - 實際上,他們是有點老了,但仍然非常真實。您現在正體驗到SOAP被人們所批評的 - 完全複雜和各種實現的一般不兼容性 - 特別是跨平臺。

+0

你在這兩方面都絕對正確。 SOAP很陳舊,不幸的是我對WCF和REST服務沒有足夠的知識或經驗來完成轉換。 (除非你知道我沒有找到一個驚人的教程...) – Magua 2010-11-28 07:36:33

0

在你DOT網的Web服務請參閱下面的功能:

[SoapRpcMethod] 
[WebMethod] 
public Complex GetComplex(string Name) 
{ 
    Complex myObj = new Complex(); 
    if (Name == "" || Name == null) Name = "empty param"; 
    myObj.name = "Return FRom My " + Name; 
    myObj.value = 888; 
    return myObj; 
} 

當您使用[SoapRpcMethod]因爲返回複雜的類型。 在Java PROGRAME:

SoapObject rpc4 = new SoapObject(serviceNamespace, "GetComplex"); 

rpc4.addProperty("Name", "Johnson TONG"); 

下面的代碼也被工作壓力太大

PropertyInfo pi = new PropertyInfo(); 
pi.name= "Name"; 
pi.type = PropertyInfo.STRING_CLASS; 

rpc4.addProperty(pi, "Johnson"); 

int MyCount = rpc4.getPropertyCount(); 
SoapSerializationEnvelope envelope4 = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
envelope4.bodyOut = rpc4; 
envelope4.dotNet = false; // <-- 

永遠不要使用envelope4.dotNet = true這將永遠傳遞null值 到服務器的原因,我不知道。

envelope4.setOutputSoapObject(rpc4); 
envelope4.addMapping("http://tempuri.org/encodedTypes", "Complex", new Complex().getClass()); 
HttpTransport ht4 = new HttpTransport(serviceUrl); 
ht4.setXmlVersionTag("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); 
ht4.debug = true; 
0

我注意到布爾參數有問題。 我注意到你的代碼目前沒有任何代碼,但是這只是一個提醒。 我只是改變了布爾值來整數