Как выглядит ваш .NET Webservice?
У меня был такой же эффект при использовании ksoap 2.3 с code.google.com . Я следовал руководству по The Code Project (что здорово, кстати.)
И каждый раз, когда я использовал
Integer result = (Integer)envelope.getResponse();
чтобы получить результат моего веб-сервиса (независимо от типа, я пробовал Object, String, int), я столкнулся с исключением org.ksoap2.serialization.SoapPrimitive
.
Я нашел решение (обходной путь). Первое, что мне нужно было сделать, - это удалить атрибут SoapRpcMethod () из моих методов веб-сервиса.
[SoapRpcMethod(), WebMethod]
public Object GetInteger1(int i)
{
// android device will throw exception
return 0;
}
[WebMethod]
public Object GetInteger2(int i)
{
// android device will get the value
return 0;
}
Затем я изменил свой код Android на:
SoapPrimitive result = (SoapPrimitive)envelope.getResponse();
Тем не менее, я получаю объект SoapPrimitive, который имеет поле "значение", которое является частным. К счастью, значение передается через метод toString()
, поэтому я использую Integer.parseInt(result.toString())
, чтобы получить свое значение, чего мне достаточно, потому что у меня нет сложных типов, которые мне нужно получить из моего веб-сервиса.
Вот полный источник:
private static final String SOAP_ACTION = "http://tempuri.org/GetInteger2";
private static final String METHOD_NAME = "GetInteger2";
private static final String NAMESPACE = "http://tempuri.org/";
private static final String URL = "http://10.0.2.2:4711/Service1.asmx";
public int GetInteger2() throws IOException, XmlPullParserException {
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
PropertyInfo pi = new PropertyInfo();
pi.setName("i");
pi.setValue(123);
request.addProperty(pi);
SoapSerializationEnvelope envelope =
new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
AndroidHttpTransport androidHttpTransport = new AndroidHttpTransport(URL);
androidHttpTransport.call(SOAP_ACTION, envelope);
SoapPrimitive result = (SoapPrimitive)envelope.getResponse();
return Integer.parseInt(result.toString());
}