Веб-служба Android, KSoap2 и .NET с параметрами = NULL - PullRequest
6 голосов
/ 27 ноября 2010

Видимо, это довольно часто встречающаяся проблема.Я не совсем уверен, в чем проблема или что нужно исправить, но я не могу получить ничего, кроме результата NULL, для моего SoapObject или SoapPrimitive из моего веб-сервиса .NET XML с параметрами.

Я перепробовал все, что нашел в сети:

  • Добавление .setXmlVersionTag = без изменений
  • Использование SoapObject вместо SoapPrimitive = без изменений
  • Использование SoapPrimitive вместо SoapObject = без изменений
  • Использование HttpTransportSE вместо AndroidHttppTransport = без изменений
  • Использование AndroidHttpTransport вместо HttpTransportSE = без изменений
  • Установка .dotNet = true= без изменений
  • Удаление строки назначения .dotNet = без изменений
  • Удаление двоеточия (весь префикс 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', которые, очевидно, (частично или полностью) связаны с проблемой.)

Если это имеет значение, я пишу это для целевой платформы 1.6 с KSoap2 2.5.2, и она ведет себя одинаково во всехвсе мои разные эмуляторы Android.

Я прослушал пакеты с помощью wireshark, и эмулятор, кажется, отправляет правильные данные, но полученные результаты всегда равны NULL.(Я тестировал эти точные параметры много раз на своем тестовом веб-сайте, который использует эти веб-сервисы, и там все отлично работает.)

Итак, кто-нибудь может бросить мне кость?

Спасибо,

Магуа

РЕДАКТИРОВАТЬ 2010.11.28:

Несмотря на то, что Wireshark говорит мне, что я отправляю параметры, может показаться, чтовеб-сервис не получает их правильно, или что-то подобное.Я создал совершенно новый сервис, который должен был возвращать простую строку, каким бы ни был первый параметр, с «TEST» в конце, жестко закодированным из самого веб-сервиса.

Ну, каждый раз, когда я запускаю это (от Android) Я получаю результат, и это всегда "ТЕСТ".Независимо от того, как я формулирую SoapEnvelope или независимо от того, что я передаю в качестве параметра, я всегда получаю «ТЕСТ».Конечно, когда я вызываю веб-сервис на сервере, он работает как чемпион (и мой результат - «ЭТО ТЕСТ»).

Мой веб-сервис работает на Windows Server 2008 с IIS 7. Пул приложенийработает на платформе v2.0 (не v4.0) с «интегрированным» режимом управляемого конвейера.

Понятия не имею, где находится разъединение.KSoap2 отправляет параметры неправильно?IIS настроен неправильно?Что-то еще целиком?

Ответы [ 5 ]

8 голосов
/ 28 ноября 2010

Ничего себе. Мелом до этого всякого рода странностей и упущений, но я исправил это.

Проблема заключалась в пропущенном конце / / в конце пространства имен. НЕ пространство имен, объявленное для глобалов Android, но пространство имен, объявленное в самой веб-службе в верхней части файла service.asmx.cs. (Непосредственно над WebServiceBinding).

Как только я добавил это в конец, все функционировало как чемпион.

Как ни странно, это явно влияет на ТОЛЬКО методы, которые принимают параметры , так как эти методы без параметров работали отлично. И только с KSoap2 в качестве моего веб-сайта, который использует те же самые сервисы, функционировал безупречно.

1 голос
/ 28 ноября 2010

Это может быть не тот ответ, который вы хотели бы услышать, но, как правило, если бы я был на вашем месте, я бы подумал о том, чтобы переключиться с SOAP (например, на веб-сервис в стиле REST).

Существует множество статей, критикующих SOAP (и WSDL, и UDDI), - вы, вероятно, видели некоторые из них, такие как 1 , 2 , 3 - и, действительно, они немного старые, но все еще очень верные. Теперь вы точно знаете, за что критикуют SOAP - полная сложность и общая несовместимость различных реализаций - особенно кроссплатформенных.

0 голосов
/ 03 мая 2015

в моем случае я потерял много времени, пытаясь использовать SOAP, у меня было много ошибок, пока вы не использовали REST.

Эта ссылка ведет к учебнику по использованию REST

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

0 голосов
/ 19 июля 2012

Я заметил проблему с логическими параметрами.Я заметил, что в вашем коде сейчас нет кода, но это всего лишь один на один.Я просто изменил логическое значение на целое число

0 голосов
/ 12 января 2011

В 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;
...