【问题标题】:sending complex object from android to vb.net webservice将复杂对象从 android 发送到 vb.net webservice
【发布时间】:2014-04-27 19:01:53
【问题描述】:

我正在尝试使用 Web 服务将 PersonalInfo 对象从 android 发送到 vb.net。我有连接,因为我可以发送原始类型。

这就是我目前所拥有的......

这是安卓活动

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 端接收它然后对其进行操作 请协助提前谢谢大家

【问题讨论】:

  • 切换到WCF,在生成客户端代码后,您将可以访问在.svc 文件中标记为&lt;DataContract&gt; 的复杂对象。
  • 感谢您的评论。你能解释一下我不知道如何“切换到 wcf”
  • OneFineDay......我需要创建 WCF 服务库或 WCF 服务应用程序还是可以使用我现有的 .net Web 项目?
  • 您只需将服务库添加到您的项目中。添加引用,一旦完成,它将生成客户端引用代码。

标签: android vb.net web-services


【解决方案1】:

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

感谢 OneFineDay 的帮助

【讨论】:

  • 很高兴你明白了 =)
  • 我还有一个小问题。我使用下面的代码完成了发送复杂对象的工作。如何发送该复杂对象的列表?谁能帮忙
【解决方案2】:

这是我用来传递实现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??

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    相关资源
    最近更新 更多