6

显然,这是一个经常遇到的问题。我不完全确定问题出在哪里,或者需要调整什么,但对于我的生活,除了 NULL 结果之外,我无法从我的 .NET XML Web 服务中检索到带有参数的 SoapObject 或 SoapPrimitive 的任何结果。

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

  • 添加 .setXmlVersionTag = 没有变化
  • 使用 SoapObject 代替 SoapPrimitive = 没有变化
  • 使用 SoapPrimitive 代替 SoapObject = 没有变化
  • 使用 HttpTransportSE 而不是 AndroidHttppTransport = 没有变化
  • 使用 AndroidHttpTransport 代替 HttpTransportSE = 没有变化
  • 设置 .dotNet = true = 没有变化
  • 删除 .dotNet 分配行 = 没有变化
  • 从 Web 服务中删除冒号(整个 HTTP:// 前缀)= 没有变化
  • 使用 PropertyInfo 类而不是直接赋值 = 没有变化
  • 使用直接赋值而不是 PropertyInfo 类 = 没有变化

我完全不知所措,这非常令人沮丧。我完全控制了网络服务(我写了它),所以如果有帮助,我愿意尝试。

目前我的代码如下:

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 服务的测试网站多次测试了这些确切的参数,并且在那里一切正常。)

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

谢谢,

马瓜

编辑 2010.11.28:

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

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

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

我不知道脱节在哪里。KSoap2 是否不正确地发送参数?IIS 是否配置不正确?完全不同的东西?

4

5 回答 5

8

哇。将此归结为各种奇怪和疏忽,但我已经修复了它。

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

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

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

于 2010-11-28T08:54:03.883 回答
1

这可能不是您想听到的答案,但一般来说,如果我站在您的立场上,我会考虑从 SOAP 切换(例如,切换到 REST 样式的 Web 服务)。

有无数批评 SOAP(以及 WSDL 和 UDDI)的文章四处流传——您可能已经看过其中的一些,例如123 ——事实上,它们有点陈旧,但仍然非常真实。您现在正在体验 SOAP 被批评的地方——各种实现的完全复杂性和普遍不兼容——尤其是跨平台。

于 2010-11-28T06:43:29.637 回答
0

我注意到布尔参数存在问题。我注意到您的代码目前没有任何代码,但这只是一个提示。我只是将布尔值更改为整数

于 2012-07-19T12:33:13.867 回答
0

在 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 程序中:

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由于我不知道的原因,永远不要使用它总是将空值传递给服务器。

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;
于 2011-01-12T12:15:05.470 回答
0

就我而言,我在尝试使用 SOAP 时浪费了很多时间,我遇到了很多错误,直到您使用 REST。

此链接指向使用 REST 的教程

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

于 2015-05-03T18:01:26.057 回答