Библиотека KSOAP2 ... Ошибка отправки данных в asmx webservice - PullRequest
3 голосов
/ 12 января 2012

У меня настроена веб-служба ASMX в Microsoft Azure, и я пытаюсь отправить данные в веб-службу и получить выходные данные с помощью приложения для Android.Для этой цели я использую библиотеку KSOAP.

В веб-сервисе я проверяю, являются ли строки пустыми.Если они есть, я возвращаю код ошибки «2405»

[WebMethod]
        public string LoginUser(string auth_token, string username)
        {
            // All these tests performed, so someone from outside of out application
            // scope does not attempt to abuse our webservice.
            #region Check for nulls
            if (string.IsNullOrEmpty(auth_token))
                return "2405";
            if (string.IsNullOrEmpty(username))
                return "2405";
            #endregion
        }

В моем приложении для Android я отправляю данные, но веб-служба по-прежнему возвращает код ошибки 2405, что означает, что данные не отправляются.

Вот мой код Android:

        SoapObject request = new SoapObject(NAMESPACE, method_name);

        PropertyInfo pi = new PropertyInfo();
        pi.setName("auth_token");
        pi.setValue("TestAuth");
        request.addProperty(pi);

        PropertyInfo pe = new PropertyInfo();
        pe.setName("username");
        pe.setValue("TestUser");
        request.addProperty(pe);

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);
        envelope.dotNet = true;

        envelope.setOutputSoapObject(request);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        androidHttpTransport.call(SOAP_ACTION, envelope);

Извините, что могу предоставить вам пространство имен, имя метода, URL и т. Д. Это противоречит политике компании, и я надеюсь, что вы понимаете,:)

Тем не менее, я снова перейду к ошибке.После вызова вышеуказанного кода Android веб-служба возвращает 2405, что в соответствии с кодом ASMX означает, что любое из двух значений равно нулю. ОБНОВЛЕНИЕ: Я отладил запрос SOAP (androidHttpTransport.debug = true) и получил следующие результаты для requestDump и responseDump.

Дамп запроса

<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
            xmlns:d="http://www.w3.org/2001/XMLSchema" 
            xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" 
            xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
  <v:Header />
  <v:Body>
    <LoginUser xmlns="http://tempuri.org" id="o0" c:root="1">
      <auth_token i:type="d:string">TestAuth</auth_token>
      <username i:type="d:string">TestUser</username>
    </LoginUser>
  </v:Body>
</v:Envelope>

responseDump

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
               xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <LoginUserResponse xmlns="http://tempuri.org/">
      <LoginUserResult>2405</LoginUserResult>
    </LoginUserResponse>
  </soap:Body>

</soap:Envelope>

ОБНОВЛЕНИЕ 2 Вот что ожидает сервер:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <LoginUser xmlns="http://tempuri.org/">
      <auth_token />
      <username />
    </LoginUser>
  </soap:Body>
</soap:Envelope>

Это то, что приложение android отправляет :

<?xml version="1.0" encoding="utf-8"?>
<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance"     xmlns:d="http://www.w3.org/2001/XMLSchema"  xmlns:c="http://schemas.xmlsoap.org/soap/encoding/"     xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
<v:Header />
    <v:Body>
        <LoginUser xmlns="http://tempuri.org" id="o0" c:root="1">
            <auth_token i:type="d:string">TestAuth</auth_token>
            <username i:type="d:string">TestUser</username>
        </LoginUser>
    </v:Body>
</v:Envelope>

В дополнение к этому я добавил следующую строку в код Android:

androidHttpTransport.setXmlVersionTag("<?xml version=\"1.0\" encoding=\"utf-8\"?>");

ПОЖАЛУЙСТА, ПОМОГИТЕ!

Большое спасибо!

Ответы [ 3 ]

2 голосов
/ 16 января 2012

Мне удалось очистить ошибку ... Проблема заключалась в том, что у меня не было обратной косой черты после URI пространства имен ... Причина, по которой я этого не сделал, заключается в том, что с обратной косой чертой я получил ошибку "Последовательность не содержитelements "... Теперь, однако, у меня разные ошибки ... Если мне понадобится помощь, я опубликую на StackOverFlow ... Спасибо за щедрую помощь:)

Чтобы было понятно, пространство имен должен иметь в конце обратную косую черту, чтобы сервер мог принимать любые параметры.

0 голосов
/ 01 декабря 2012

в пространстве имен, это поможет вам написать http с заглавной H, как это

вместо namespace = "http://tempuri.org/"; попробуй это Пространство имен = "Http://tempuri.org";

по крайней мере в моем случае помогло. Я надеюсь, что какое-то тело помогает!

Gabriel

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

Привет
Существует два способа решения вашей проблемы: один из них - это использование PropertyInfo, а второй - мой способ: непосредственное добавление параметра в запрос параметра.

Первые пути:

            PropertyInfo pi = new PropertyInfo();
            pi.setName("auth_token");
            pi.setValue("TestAuth");
            pi.setType(String.class);
            request.addProperty(pi);

            PropertyInfo pe = new PropertyInfo();
            pe.setName("username");
            pe.setValue("TestUser");
            pe.setType(String.class);
            request.addProperty(pe);

Вторые пути:

    SoapObject request = new SoapObject(NAMESPACE, method_name);
    request.addProperty("auth_token","TestAuth");
    request.addProperty("username","TestUser");

Попробуйте этот код, он будет работать.

...