使用SOAP从ASP.NET Web服务向Android客户端返回字符串数组
我想返回一个字符串数组到我的Android客户端并填充一个ListView。 我正在使用SOAP库(org.ksoap2.*)调用ASP.NET web服务使用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.
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扩展了异步任务{