将简单字符串参数传递给.net webservice的问题

时间:2010-06-21 13:53:45

标签: .net android web-services ksoap2 ksoap

我有以下代码调用.net webservice。代码连接到服务正常,但参数(deviceid)似乎没有通过。该方法只返回传递的deviceid,它始终为null。

这告诉我没有传递deviceid参数。我以为我看到有人推荐一个数据包嗅探器来查看传出的xml,但似乎无法记住它是什么。有人可以建议我可以与eclipse和windows一起使用。

活动代码

    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();

    }

网络服务代码

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

        Return deviceid
    End Function

我,我已经尝试了一切,无法弄清楚如何解决这个问题。有没有其他人有任何建议可以尝试?

xml从铁丝鲨发送为间谍:

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>

由于

帕特里克

3 个答案:

答案 0 :(得分:1)

如果我没弄错的话,ht.call(...)会返回一个SoapSerializationEnvelope。我相信你需要从你的信封中取出你的反应,而不是你传递的信息

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

如果不起作用: 你在使用kso​​ap2 for android(有Java版本和Android版本)吗?您的网络服务是否要求您登录?在尝试执行类似的任务时,我发现ksoap没有存储会话cookie,尤其是会话ID。我们不得不extend ServiceConnection和HttpTransportSE将cookie保存为String以保持登录

就数据包嗅探器而言,请查看wire shark

答案 1 :(得分:0)

尝试设置PropertyInfo对象的命名空间。

    pi.setNamespace(NAMESPACE);

答案 2 :(得分:0)

尝试从webservice中的命名空间中删除冒号(:),即只需将其设为ikonicsoft.com而不是http://ikonicsoft.com - 并更新您的soap引用调用以使用新的命名空间。这很疯狂,但这解决了我的问题(在Blackberry上,但我认为同样的原则适用)。

编辑 - 如果您尝试使用您不拥有的Web服务,这不是理想的,但它至少是一种使用您自己的Web服务的解决方案。我绝对感到困惑的是为什么那里的冒号搞乱了,但我注意到直接在网络服务器上做了一个HTML帖子(通过telnet到网络服务器上的端口80),我得到了同样的错误。