将复杂对象从android发送到vb.net webservice

时间:2014-04-27 19:01:54

标签: android vb.net web-services

我试图使用Web服务从Android向vb.net发送PersonalInfo对象。我有连接,因为我可以发送原始类型。

这是我到目前为止所拥有的......

这是android活动

package com.msc.mynamespace;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;

import com.msc.mynamespace.db.DatabaseHelper;
import com.msc.mynamespace.model.PersonalInfo;

import android.os.AsyncTask;
import android.os.Bundle;

import android.view.View;

import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MyActivity extends DashboardActivity {

    DatabaseHelper db ;

    TextView textView1;
    EditText editText1;
    Button button1;
    String test;

    final String NAMESPACE = "http://mywebnamespace.org/";
    final String URL = "http://localhost/MyWebService.asmx";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sync);
        db = new DatabaseHelper(this);
 }

    public void CallWebservice(View v) {


        this.SyncPersonalInfo();
    }


        //starting asynchronus task
     private class SyncPersonalInfoTask extends AsyncTask<String, Void, String> {

         @Override
         protected void onPreExecute() {
              //if you want, start progress dialog here
         }

         @Override
         protected String doInBackground(String... urls) {
             String webResponse = "";
            try{

              final String SOAP_ACTION = "http://mywebnamespace.org/SyncPersonalInfo";
              final String METHOD_NAME = "SyncPatientInfo";
              PersonalInfo pi=db.RetrievePersonalInfo();//this is PersonalInfo object that i get from the database

              SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
              PropertyInfo fromProp =new PropertyInfo();
              fromProp.setName("PI");
              fromProp.setValue(pi);
              fromProp.setType(pi.getClass());
              request.addProperty(fromProp);



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

              //envelope.addMapping(NAMESPACE, "PersonalInfo",new PersonalInfo().getClass());

              HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

              androidHttpTransport.call(SOAP_ACTION, envelope);
              SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
              webResponse = response.toString();
           }
           catch(Exception e){

              Toast.makeText(getApplicationContext(),"Cannot access the web service"+e.toString(), Toast.LENGTH_LONG).show(); 
            }

             return webResponse;
        }
         @Override
         protected void onPostExecute(String result) {

                 Toast.makeText(getApplicationContext(),"Completed...", Toast.LENGTH_LONG).show();
              }
     }

        public void SyncPersonalInfo(View view) {
            SyncPersonalInfoTask task = new SyncPersonalInfoTask();

               //passes values for the urls string array 
               task.execute();
              }  
}

这是vb.net部分

    Imports System.Web
    Imports System.Web.Services
    Imports System.Web.Services.Protocols

<WebService(Namespace:="http://mywebnamespace.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class MyWebService
    Inherits System.Web.Services.WebService


    Public Class PersonalInfo
        Public fname As String
        Public lname As String
    End Class
    <WebMethod()> _
    Public Function SyncPatientInfo(//what to put here??) As String
       //how to manipulate the parameter??
    End Function



End Class

我迷失了如何发送PersonalInfo对象以及如何在.net端接收它然后操纵它 请帮助提前感谢你们

2 个答案:

答案 0 :(得分:1)

我在不使用WCF的情况下解决了这个问题。 基本上复杂的对象必须实现kvmserializable。 这个stackoverflow QandA帮助了我。 Ksoap: Cannot Serialize exception when passing user defined class as parameter to web method

感谢您帮助OneFineDay

答案 1 :(得分:0)

这是我用来传递实现kvmserializable

的PersonalInfo复杂对象
   private class SyncPersonalInfoTask extends AsyncTask<String, Void, String> {

        @Override
        protected void onPreExecute() {
            // if you want, start progress dialog here
        }

        @Override
        protected String doInBackground(String... urls) {
            String webResponse = "";
            try {

                final String SOAP_ACTION = "http://mywebnamespace.org/SyncPersonalInfo";
                final String METHOD_NAME = "SyncPersonalInfo";
                PersonalInfo pi = db.RetrievePersonalInfo();

                SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

                PropertyInfo fromProp = new PropertyInfo();
                fromProp.setName("PI");
                fromProp.setValue(pi);
                fromProp.setType(pi.getClass());
                request.addProperty(fromProp);

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

                envelope.addMapping(NAMESPACE, "PersonalInfo",new PersonalInfo().getClass());

                MarshalDouble md = new MarshalDouble();// for serializing double
                md.register(envelope);
                HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

                androidHttpTransport.call(SOAP_ACTION, envelope);
                SoapPrimitive response = (SoapPrimitive) envelope.getResponse();
                webResponse = response.toString();
            } catch (Exception e) {
                webResponse = "Cannot access the web service" + e.toString();
            }

            return webResponse;
        }

        @Override
        protected void onPostExecute(String result) {
            Toast.makeText(getApplicationContext(), "Completed...",Toast.LENGTH_LONG).show();
        }
    }

接受复杂对象的vb.net webservice如下

Public Class PersonalInfo
    Public ID As Integer
    Public FirstName As String
    Public LastName As String


End Class

     <WebMethod()> _
Public Function SyncPersonalInfo(ByVal PI As PersonalInfo) As String
   return PI.LastName

End Function

现在我想要

<WebMethod()> _
Public Function SyncPersonalInfo(ByVal PersonalInfoList As List(Of PersonalInfo)) As String
  //iterate through PersonalInfoList

End Function

如何将List发送到webservice?