Как вызвать .NET Webservice с Android с помощью KSOAP2?

У меня проблема при вызове webservice. У меня есть веб-сервис .NET на сервере, и я использую KSOAP2 (ksoap2-j2se-full-2.1.2) в Android. Во время запуска программы я получил исключение во время выполнения, например «org.ksoap2.serialization.SoapPrimitive». Что мне делать?

Вот мой код.

package projects.ksoap2sample; import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapSerializationEnvelope; import org.ksoap2.transport.HttpTransportSE; import android.app.*; import android.os.*; import android.widget.TextView; public class ksoap2sample extends Activity { /** Called when the activity is first created. */ private static final String SOAP_ACTION = "http://tempuri.org/HelloWorld"; private static final String METHOD_NAME = "HelloWorld"; private static final String NAMESPACE = "http://tempuri.org/"; private static final String URL = "http://192.168.1.19/TestWeb/WebService.asmx"; TextView tv; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tv=(TextView)findViewById(R.id.text1); try { SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); //request.addProperty("prop1", "myprop"); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.dotNet=true; envelope.setOutputSoapObject(request); HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); androidHttpTransport.call(SOAP_ACTION, envelope); Object result = (Object)envelope.getResponse(); String[] results = (String[]) result; tv.setText( ""+results[0]); } catch (Exception e) { tv.setText(e.getMessage()); } } } 

Solutions Collecting From Web of "Как вызвать .NET Webservice с Android с помощью KSOAP2?"

Это очень просто. Вы получаете результат в Object который является примитивным.

Ваш код:

 Object result = (Object)envelope.getResponse(); 

Правильный код:

 SoapObject result=(SoapObject)envelope.getResponse(); //To get the data. String resultData=result.getProperty(0).toString(); // 0 is the first object of data. 

Я думаю, что это определенно должно работать.

Как выглядит ваш .NET Webservice?

У меня был такой же эффект, используя ksoap 2.3 с code.google.com . Я следовал учебному курсу «Проект кода» (который отличает BTW).

И каждый раз, когда я использовал

  Integer result = (Integer)envelope.getResponse(); 

Чтобы получить результат моего org.ksoap2.serialization.SoapPrimitive (независимо от типа, я попробовал Object, String, int) Я столкнулся с org.ksoap2.serialization.SoapPrimitive .

Я нашел решение (обходное решение). Первое, что мне нужно было сделать, – удалить атрибут SoapRpcMethod () из моих методов webservice.

  [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()); } 

Typecast конверт SoapPrimitive:

 SoapPrimitive result = (SoapPrimitive)envelope.getResponse(); String strRes = result.toString(); 

И это сработает.

Вы можете использовать код ниже, чтобы вызвать веб-службу и получить ответ. Убедитесь, что ваш веб-сервис возвращает ответ в формате таблицы данных. Этот код поможет вам, если вы используете данные из базы данных SQL Server. Если вы используете MYSQL, вам нужно Измените одну вещь, просто замените слово NewDataSet из предложения obj2=(SoapObject) obj1.getProperty("NewDataSet"); По DocumentElement

 private static final String NAMESPACE = "http://tempuri.org/"; private static final String URL = "http://localhost/Web_Service.asmx?"; // you can use IP address instead of localhost private static final String METHOD_NAME = "Function_Name"; private static final String SOAP_ACTION = NAMESPACE + METHOD_NAME; SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); request.addProperty("parm_name", prm_value); // Parameter for Method SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.dotNet = true; envelope.setOutputSoapObject(request); HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); try { androidHttpTransport.call(SOAP_ACTION, envelope); //call the eb service Method } catch (Exception e) { e.printStackTrace(); } //Next task is to get Response and format that response SoapObject obj, obj1, obj2, obj3; obj = (SoapObject) envelope.getResponse(); obj1 = (SoapObject) obj.getProperty("diffgram"); obj2 = (SoapObject) obj1.getProperty("NewDataSet"); for (int i = 0; i < obj2.getPropertyCount(); i++) //the method getPropertyCount() return the number of rows { obj3 = (SoapObject) obj2.getProperty(i); obj3.getProperty(0).toString(); //value of column 1 obj3.getProperty(1).toString(); //value of column 2 //like that you will get value from each column } 

Если у вас есть проблемы с этим, вы можете написать мне ..

Если ожидается более одного результата, метод getResponse() вернет Vector содержащий различные ответы.

В этом случае код нарушения становится:

 Object result = envelope.getResponse(); // treat result as a vector String resultText = null; if (result instanceof Vector) { SoapPrimitive element0 = (SoapPrimitive)((Vector) result).elementAt(0); resultText = element0.toString(); } tv.setText(resultText); 

Ответ, основанный на ksoap2-android (вилка mosabua)

Я думаю, вы не можете позвонить

  androidHttpTransport.call(SOAP_ACTION, envelope); 

На главной теме.

Сетевые операции должны выполняться для разных потоков.

Создайте другой Thread или AsyncTask, чтобы вызвать метод.