2010-11-27 2 views
6

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

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

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

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

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

Спасибо,

Magua

EDIT 2010.11.28:

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

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

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

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

ответ

7

Ничего себе. Мел этот до всех видов странностей и оплошностей, но я исправил его.

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

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

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

1

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

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

+0

Вы абсолютно правы в обеих областях. SOAP устарел, к сожалению, я недостаточно осведомлен или достаточно опытным для служб WCF и REST, чтобы сделать переход еще. (Если вы не знаете об удивительном учебнике, которого я не нашел ...) – Magua 2010-11-28 07:36:33

0

В Вы DOT NET веб-службы см функцию ниже:

[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; 
0

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