繁体   English   中英

Android,KSoap2和.NET Web服务w /参数= NULL结果

[英]Android, KSoap2 and .NET Web Service w/ parameters = NULL result

显然,这是一个经常遇到的问题。 我不确定问题所处的位置,或者需要调整的地方,但对于我的生活,除了带有参数的.NET XML Web服务的SoapObject或SoapPrimitive,我无法检索除NULL结果之外的任何内容。

我已经尝试过我在网上找到的所有内容:

  • 添加.setXmlVersionTag =没有变化
  • 使用SoapObject而不是SoapPrimitive =没有变化
  • 使用SoapPrimitive而不是SoapObject =没有变化
  • 使用HttpTransportSE而不是AndroidHttppTransport =没有变化
  • 使用AndroidHttpTransport而不是HttpTransportSE =没有变化
  • 设置.dotNet = true =无变化
  • 删除.dotNet分配行=没有变化
  • 从Web服务中删除冒号(整个HTTP://前缀)=无更改
  • 使用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";

我知道'yoda'正在翻译,因为我的非参数化网络服务就像一个血腥的冠军。 (除了'request.addProperty'调用之外,一切都是相同的,这显然是(部分或全部)手头的问题。)

如果它很重要我正在使用KSoap2 2.5.2在1.6目标平台上编写它,并且它在我所有不同的Android模拟器中表现相同。

我用wireshark嗅探了数据包,模拟器似乎正在发送正确的东西,但它收到的结果总是为NULL。 (我已经对使用这些Web服务的测试网站多次测试了这些确切的参数,并且所有这些都在那里完美运行。)

那么,有人可以在这里扔我一块骨头吗?

谢谢,

Magua

编辑2010.11.28:

即使Wireshark告诉我,我发送参数,似乎Web服务没有正确接收它们,或类似的东西。 我创建了一个全新的服务,假设返回一个简单的字符串,无论第一个参数是什么,最后是“TEST”,从Web服务本身硬编码。

好吧,每次我运行它(从Android)我都会得到一个结果,它总是“TEST”。 无论我如何制定SoapEnvelope或无论我作为参数传递什么,我总是收到“TEST”。 当然,当我在服务器上调用Web服务时,它就像一个冠军(我的结果是“这是一个测试”)。

我的Web服务位于带有IIS 7的Windows Server 2008上。应用程序池针对具有“集成”托管管道模式的框架v2.0(而不是v4.0)运行。

我不知道断开的地方在哪里。 KSoap2是否发送参数不正确? IIS配置不正确吗? 还有别的吗?

哇。 将这一点归结为各种各样的怪异和疏忽,但我已经解决了这个问题。

问题是名称空间末尾缺少尾随'/'。 不是为Android全局变量声明的名称空间,而是在Service.asmx.cs文件顶部附近的Web服务本身声明的名称空间。 (直接在WebServiceBinding之上)。

一旦我把它添加到最后,一切都像冠军一样运作。

奇怪的是,这显然会影响仅采用参数的方法,因为那些没有参数的方法工作得很好。 只有使用KSoap2作为我的网站,使用完全相同的服务才能完美运行。

这可能不是你想听到的答案,但是,一般来说,如果我在你的位置,我会考虑从SOAP(例如REST风格的Web服务)转向。

有漂浮的文章批评SOAP(以及WSDL和UDDI)无数-你可能已经看到了其中的一些,如123 -实际上,他们是有点老了,但还是很真实的。 您现在正在体验到被批评的SOAP究竟是什么 - 各种实现的完全复杂性和一般不兼容性 - 尤其是跨平台。

我注意到布尔参数有问题。 我注意到你的代码当前没有任何代码,但这只是一个抬头。 我只是将布尔值改为整数

在我的情况下,我失去了很多时间尝试使用SOAP,我有很多错误,直到你使用REST。

此链接指向使用REST的教程

http://programmerguru.com/android-tutorial/android-restful-webservice-tutorial-how-to-call-restful-webservice-in-android-part-3/

在You DOT NET WEB SERVICE中,请参阅以下功能:

[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值传递给Server,因为我不知道。

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM