Хорошо, я наконец-то разобрался в своих проблемах.Было несколько факторов, которые можно ожидать от кого-то нового в этих технологиях.Надеюсь, мои ошибки сэкономят время другим.
Первая проблема, с которой я столкнулся, была ошибка параметра в моем коде.Строка
androidHttpTransport.call("http://192.168.1.72:61554/SayHello", envelope);
была неправильной в том смысле, что в ней должно было быть указано пространство имен для моего веб-сервиса, а затем имя метода.Таким образом, я изменил эту строку на следующую:
androidHttpTransport.call("http://sample.com/SayHello", envelope);
После этого изменения у меня все еще была строка, выдавшая исключение, но теперь я получал другое исключение, которое было по крайней мере моральной победой.Новое исключение говорит следующее:
expected START_TAG{http://schemas.xmlsoap.org/soap/envelope/} Envelope(position:START_TAG<html>@1:6 in java.io.InputStreamReader@d3el2cc4)
Это сообщение широко распространено в Интернете, но ни одно из найденных мной решений не сработало для меня.После большого количества проб и ошибок я нашел свою конкретную проблему.Мой веб-сервис создан в Visual Studio 2008, и я тестирую его, просто запустив в Visual Studio, а затем пытаюсь использовать его из моего эмулятора Android.Оказывается, в IIS «песочницы» VS2008 есть параметр безопасности, который отклоняет любые запросы, выходящие за пределы локального ПК, и, очевидно, эмулятор не считается локальным ПК.
Чтобы исправить эту проблему, я воспользовалсяследующие действия в Visual Studio 2008:
- Выйдите из Visual Studio и откройте его с правами администратора (я использую Windows 7).
- Открыв свой проект, я просмотрел свойства проекта.
- На вкладке «Интернет» я изменил радиокнопку раздела «Серверы» на «Использовать локальный веб-сервер IIS», ввел «http://localhost/Sample" в качестве URL-адреса моего проекта и нажал кнопку« Создать виртуальный каталог ».
После выполнения этих шагов я снова запустил свой веб-сервис, запустил свое приложение Android в эмуляторе и, наконец, получил строку, которая выдавала исключение все время. Однако на этот раз следующая строка вызвалаисключение. Еще одна моральная победа и шаг вперед. Это новое исключение было:
org.ksoap2.serialization.SoapPrimitive
Быстрый поиск в Google решил это за mе.Строки
SoapObject response = (SoapObject)envelope.getResponse();
String resultValue = response.getProperty(0).toString();
в моем исходном коде нужно было изменить на следующее:
SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
String resultValue = response.toString();
После этого изменения у меня было рабочее приложение.
Finalрабочий код
веб-служба (созданная в Visual Studio 2008 и работающая на локальном веб-сервере IIS в соответствии с настройками в свойствах проекта)
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Services;
namespace Sample {
[WebService(Namespace = "http://sample.com/")]
public class Service1 : System.Web.Services.WebService {
[WebMethod]
public string SayHello() {
return "Hello, Android. From your friend, WCF";
}
}
}
класс Android
package com.sample;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import org.ksoap2.*;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.*;
import org.ksoap2.serialization.SoapPrimitive;
public class Sample extends Activity {
TextView result;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
result = (TextView)findViewById(R.id.textViewResult);
final String SOAP_ACTION = "http://sample.com/SayHello";
final String METHOD_NAME = "SayHello";
final String NAMESPACE = "http://sample.com/";
final String URL = "http://192.168.1.72/Sample/Service1.asmx";
try {
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
androidHttpTransport.call(SOAP_ACTION, envelope);
SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
String resultValue = response.toString();
result.setText(resultValue);
}
catch (Exception e) {
result.setText(e.getMessage());
}
}
}