【问题标题】:Android, KSoap2 and .NET Web Service w/ parameters = NULL result带参数的 Android、KSoap2 和 .NET Web 服务 = NULL 结果
【发布时间】:2010-11-27 04:12:15
【问题描述】:

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

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

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

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

目前我的代码如下:

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' 翻译正确,因为我的非参数化网络服务工作得像个血腥的冠军。 (一切都是相同的,除了显然(部分或所有)手头的问题。)

如果这很重要,我将针对具有 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 是否配置不正确?完全不同的东西?

【问题讨论】:

    标签: android web-services soap parameters ksoap2


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 完美,这也是我的问题。在我的例子中,整数作为有效值离开我的应用程序并作为零到达我的网络服务。
    【解决方案2】:

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

    到处都是批评 SOAP(以及 WSDL 和 UDDI)的文章——您可能已经看过其中的一些,例如 123——事实上,它们是有点老了,但还是很真实。您现在正体验到 SOAP 受到很多批评的地方 - 各种实现的极度复杂性和普遍不兼容 - 尤其是跨平台。

    【讨论】:

    • 您在这两个方面都绝对正确。 SOAP 已经过时了,不幸的是,我对 WCF 和 REST 服务的知识或经验还不够,无法进行过渡。 (除非你知道我还没有找到一个很棒的教程......)
    【解决方案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 程序中:

    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;
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        在我的例子中,我在尝试使用 SOAP 时浪费了很多时间,我遇到了很多错误,直到您使用 REST。

        此链接指向使用 REST 的教程

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-22
          • 1970-01-01
          • 2011-10-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多