Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SOAP从ASP.NET Web服务向Android客户端返回字符串数组_Android_Asp.net_Vb.net_Web Services_Soap - Fatal编程技术网

使用SOAP从ASP.NET Web服务向Android客户端返回字符串数组

使用SOAP从ASP.NET Web服务向Android客户端返回字符串数组,android,asp.net,vb.net,web-services,soap,Android,Asp.net,Vb.net,Web Services,Soap,我想返回一个字符串数组到我的Android客户端并填充一个ListView。 我正在使用SOAP库(org.ksoap2.*)调用ASP.NET web服务 import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapPrimitive; import org.ksoap2.serialization.

我想返回一个字符串数组到我的Android客户端并填充一个ListView。 我正在使用SOAP库(org.ksoap2.*)调用ASP.NET web服务

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

    public class MainActivity extends AppCompatActivity {

           private ArrayList<String> list;
           private ListView listview;
           private ArrayAdapter<String> adapter;

           @Override
           protected void onCreate(Bundle savedInstanceState) {
                     //...
                     new GetPersonList().execute("AsyncTask String");
                     //...
           }

           // Inner AsyncTask class
           private class GetPersonList extends AsyncTask<String,  Integer,String> {
                   private static final String SOAP_ACTION = "https://myNamespace/GetList";
                   private static final String METHOD_NAME = "GetList";
                   private static final String NAMESPACE = "https://myNamespace/";
                   private static final String URL =
            "https://myIISsite/myASMXfile.asmx";

                   @Override
                   protected void onPreExecute() {
                             super.onPreExecute();
                             // onPreExecute stuff
                   }

                   @Override
                   protected String doInBackground(String... arg) {
                             String result = null;

                             SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

                             //Create envelope
                             SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

                             //Required for .net
                             envelope.dotNet = true;

                             //Set output SOAP object
                             envelope.setOutputSoapObject(request);

                             //Create HTTP call object
                             HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

                             try {
                                  //Invoke web service
                                  androidHttpTransport.call(SOAP_ACTION, envelope);

                                  //Get the response
                                  SoapPrimitive response = (SoapPrimitive) envelope.getResponse();
                                  //Assign it to response to a static variable
                                  result = response.toString();
                             } catch (Exception e) {
                                  result = "error " + e.getMessage();
                             }

                             return result;
                   }

                   @Override
                   protected void onPostExecute(String result) {
                             System.out.println("Returned SOAP XML: " + result);
                             MyFunction(result);
                   }
           }
    }
以下是web服务的代码:

1。ASP Web服务

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

    <WebService(Namespace:="...")>_
    <WebService(ConformsTo:=...)> _
    <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _

    Public Class EnquiryWS
        Inherits System.Web.Services.WebService

    ' Web method
           <WebMethod()> _
           Public Function GetList() As String()
                  'Hardcoded list
                  Return New String() { "item1", "item2", "item3" }
           End Function
导入。。。
导入System.Web.Services
导入System.Web.Services.Protocols
进口。。。
_
_
_
公开课查询
继承System.Web.Services.WebService
“Web方法”
_
公共函数GetList()作为字符串()
'硬编码列表
返回新字符串(){“item1”、“item2”、“item3”}
端函数
我通过访问asmx测试了web服务,没有运行时错误。 我还用一个简单的字符串对它进行了测试,web服务将字符串返回给Android。像这样:

    ' Web method
    <WebMethod()> _
    Public Function GetString() As String
           Return "My string."
    End Function
”Web方法
_
公共函数GetString()作为字符串
返回“我的字符串”
端函数
2。Android活动

其次,这是我调用ASP.NET web服务的Android代码

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

    public class MainActivity extends AppCompatActivity {

           private ArrayList<String> list;
           private ListView listview;
           private ArrayAdapter<String> adapter;

           @Override
           protected void onCreate(Bundle savedInstanceState) {
                     //...
                     new GetPersonList().execute("AsyncTask String");
                     //...
           }

           // Inner AsyncTask class
           private class GetPersonList extends AsyncTask<String,  Integer,String> {
                   private static final String SOAP_ACTION = "https://myNamespace/GetList";
                   private static final String METHOD_NAME = "GetList";
                   private static final String NAMESPACE = "https://myNamespace/";
                   private static final String URL =
            "https://myIISsite/myASMXfile.asmx";

                   @Override
                   protected void onPreExecute() {
                             super.onPreExecute();
                             // onPreExecute stuff
                   }

                   @Override
                   protected String doInBackground(String... arg) {
                             String result = null;

                             SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

                             //Create envelope
                             SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

                             //Required for .net
                             envelope.dotNet = true;

                             //Set output SOAP object
                             envelope.setOutputSoapObject(request);

                             //Create HTTP call object
                             HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

                             try {
                                  //Invoke web service
                                  androidHttpTransport.call(SOAP_ACTION, envelope);

                                  //Get the response
                                  SoapPrimitive response = (SoapPrimitive) envelope.getResponse();
                                  //Assign it to response to a static variable
                                  result = response.toString();
                             } catch (Exception e) {
                                  result = "error " + e.getMessage();
                             }

                             return result;
                   }

                   @Override
                   protected void onPostExecute(String result) {
                             System.out.println("Returned SOAP XML: " + result);
                             MyFunction(result);
                   }
           }
    }
import org.ksoap2.SoapEnvelope;
导入org.ksoap2.serialization.SoapObject;
导入org.ksoap2.serialization.SoapPrimitive;
导入org.ksoap2.serialization.SoapSerializationEnvelope;
导入org.ksoap2.transport.HttpTransportSE;
公共类MainActivity扩展了AppCompatActivity{
私有数组列表;
私有列表视图列表视图;
专用阵列适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
//...
新建GetPersonList().execute(“AsyncTaskString”);
//...
}
//内部异步任务类
私有类GetPersonList扩展了AsyncTask{
私有静态最终字符串SOAP_ACTION=”https://myNamespace/GetList";
私有静态最终字符串方法\u NAME=“GetList”;
私有静态最终字符串命名空间=”https://myNamespace/";
私有静态最终字符串URL=
"https://myIISsite/myASMXfile.asmx";
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
//关于预执行的东西
}
@凌驾
受保护的字符串doInBackground(字符串…arg){
字符串结果=null;
SoapObject请求=新的SoapObject(名称空间、方法名称);
//创建信封
SoapSerializationEnvelope=新的SoapSerializationEnvelope(SoapEnvelope.VER11);
//是.net所必需的
envelope.dotNet=true;
//设置输出SOAP对象
envelope.setOutputSoapObject(请求);
//创建HTTP调用对象
HttpTransportSE androidHttpTransport=新的HttpTransportSE(URL);
试一试{
//调用web服务
调用(SOAP_操作,信封);
//得到回应
SoapPrimitive响应=(SoapPrimitive)信封.getResponse();
//将其分配给对静态变量的响应
结果=response.toString();
}捕获(例外e){
result=“error”+e.getMessage();
}
返回结果;
}
@凌驾
受保护的void onPostExecute(字符串结果){
System.out.println(“返回的SOAP XML:+结果”);
MyFunction(结果);
}
}
}
MyFunction是我创建用来做一些额外工作的方法

3。MyFunction

下面是MyFunction方法代码:

    public void MyFunction(String s) {
           // Add Webservice response to list
           list.add(s);

           // Set adapter
           adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item1, list);
           listview.setAdapter(adapter);

    }
public void MyFunction(字符串s){
//将Webservice响应添加到列表
列表。添加(s);
//设置适配器
适配器=新的ArrayAdapter(MainActivity.this,android.R.layout.simple\u list\u item1,list);
setAdapter(适配器);
}
我传递给MyFunction的参数是SOAP响应,然后我将其添加到列表中并设置适配器

好的,所以web服务返回一个字符串数组,但是重写的onPostExecute方法使用的是一个字符串,如果我将onPostExecute参数声明为集合,它显然不再重写

这是我在logcat中遇到的错误:

    Return SOAP XML: error expected: START_TAG {http://schemas.xmlsoap.org/soap/envelope/}Envelope (position:START_TAG <html>@1:7 in java.io.InputStreamReader@4182d238)
返回SOAP XML:预期错误:开始标记{http://schemas.xmlsoap.org/soap/envelope/}信封(位置:java.io中的START_标记@1:7)。InputStreamReader@4182d238)

有人能给我建议吗?

我找到了一个解决办法。我将响应转换为SoapObject而不是SoapPrimitive,原因是SoapPrimitive用于基本数据类型,SoapObject支持复合数据类型。因此,我将数组转换为SoapObject,而不再是SoapPrimitive

我已经删除了MyFunction()方法,因为我正在通过override run()在onPostExecute()方法中设置适配器。最后,我添加了一个ProgressDialog,在处理过程中,我在onPreExecute()方法中显示ProgressDialog,然后在onPostExecute()方法中调用dismise()

私有类GetPersonList扩展了异步任务{