Android使用WCF,即返回DataTable的特定方法
我是新到这个网站和安卓,如果有任何错误,请指出我。我的问题是soap响应 这是我的Android代码:Android使用WCF,即返回DataTable的特定方法,android,wcf,ksoap,Android,Wcf,Ksoap,我是新到这个网站和安卓,如果有任何错误,请指出我。我的问题是soap响应 这是我的Android代码: public static final String APPURL = "http://192.168.1.213:7986/XontService"; private static final String METHOD_NAME = "LoadDownLoadTables"; private static final String NAMESPACE = "
public static final String APPURL = "http://192.168.1.213:7986/XontService";
private static final String METHOD_NAME = "LoadDownLoadTables";
private static final String NAMESPACE = "http://tempuri.org/";
private static String SOAP_ACTION = "http://tempuri.org/IXontPDAService/LoadDownLoadTables";
try {
response = soap(METHOD_NAME, SOAP_ACTION, NAMESPACE, APPURL);
Log.w("log_tag","*********" + response.getProperty(0).toString());
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
}
// ksoap2 calling wcf
public SoapObject soap(String METHOD_NAME, String SOAP_ACTION, String NAMESPACE, String URL) throws IOException, XmlPullParserException {
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); //set up request
request.addProperty("strExec", "7437");
request.addProperty("strBusinessUnit", "HHHHH");
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); //put all required data into a soap envelope
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
AndroidHttpTransport httpTransport = new AndroidHttpTransport(URL);
httpTransport.debug = true;
try{
Log.w("log_tag", " ===========" +SOAP_ACTION.toString() );
Log.w("Log_cat" ,"*********" + envelope.toString());
httpTransport.call(SOAP_ACTION, envelope);
// Log.d("resBundle", String.valueOf(resBundle));
}
catch(Exception e)
{
e.printStackTrace();
}
SoapObject responses = (SoapObject)envelope.getResponse();
return responses;
}
// response processing
public String[] getStringArrayResponse(SoapObject node, Vector<String> strings) {
boolean isFirstCall = false;
if (strings == null) {
isFirstCall = true;
strings = new Vector<String>();
}
int count = response.getPropertyCount();
for (int i = 0; i < count; i++) {
Object obj1 = node.getProperty(i);
if (obj1 instanceof SoapObject) {
if (((SoapObject)obj1).getPropertyCount() > 0) {
getStringArrayResponse((SoapObject)obj1, strings);
}
} else if (obj1 instanceof SoapPrimitive) {
strings.add(((SoapPrimitive)obj1).toString());
}
}
// only make this for the original caller
if (isFirstCall) {
return (String[])strings.toArray(new String[strings.size()]);
}
return null;
}
这是我的WSDl
<wsdl:definitions name="XontPDAService" targetNamespace="http://tempuri.org/">
<wsdl:types>
<xsd:schema targetNamespace="http://tempuri.org/Imports"><xsd:import schemaLocation="http://192.168.1.213:7986/XontService?xsd=xsd0" namespace="http://tempuri.org/"/>
<xsd:import schemaLocation="http://192.168.1.213:7986/XontService?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/"/>
<xsd:import schemaLocation="http://192.168.1.213:7986/XontService?xsd=xsd2" namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/>
<xsd:import schemaLocation="http://192.168.1.213:7986/XontService?xsd=xsd3" namespace="http://schemas.datacontract.org/2004/07/System.Data"/>
<xsd:import schemaLocation="http://192.168.1.213:7986/XontService?xsd=xsd4" namespace="http://schemas.datacontract.org/2004/07/XONT.Common.Data.PDAServiceBLL"/>
<xsd:import schemaLocation="http://192.168.1.213:7986/XontService?xsd=xsd5"/></xsd:schema>
</wsdl:types>
------
------
<wsdl:operation name="LoadDownLoadTables">
<soap:operation soapAction="http://tempuri.org/IXontPDAService/LoadDownLoadTables" style="document"/><wsdl:input>
<soap:body use="literal"/></wsdl:input>
<wsdl:output><soap:body use="literal"/></wsdl:output>
</wsdl:operation>
------
------
模式文件为:
<xs:schema elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/System.Data" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://schemas.datacontract.org/2004/07/System.Data">
<xs:element name="DataTable" nillable="true">
<xs:complexType>
<xs:annotation>
<xs:appinfo>
<ActualType Name="DataTable" Namespace="http://schemas.datacontract.org/2004/07/System.Data" xmlns="http://schemas.microsoft.com/2003/10/Serialization/" />
</xs:appinfo>
</xs:annotation>
<xs:sequence>
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="http://www.w3.org/2001/XMLSchema" processContents="lax" />
<xs:any minOccurs="1" namespace="urn:schemas-microsoft-com:xml-diffgram-v1" processContents="lax" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
我得到以下信息:
AnyType{element=AnyType{complexType=AnyType{choice=AnyType{element=AnyType{complexType=AnyType{sequence=AnyType{element=AnyType{};element=AnyType{};element=AnyType{};element=AnyType{};element=AnyType{};};};};};};};};};};};};
请帮助我。您是否可以控制WCF服务(=您可以更改它)?如果是,请更改服务以返回表示数据表中的行的自定义类的一些数组/列表,并在服务操作中从数据表填充这些实例
DataTable
和DataSet
不是互操作解决方案的好选择。您传递的消息看起来更像XSD的某种“反序列化”(这是可能的,因为DataTable
可以将其描述作为其序列化数据的一部分进行传输)。您是否可以控制WCF服务(=您可以更改它)?如果是,请更改服务以返回表示数据表中的行的自定义类的一些数组/列表,并在服务操作中从数据表填充这些实例
DataTable
和DataSet
不是互操作解决方案的好选择。您传递的消息看起来更像XSD的某种“反序列化”(这是可能的,因为DataTable
可以将其描述作为序列化数据的一部分进行传输)。您必须检查返回类型asp.net数据表,然后检查return newDataSet或DocumentElement。。。若并没有返回那个些东西,那个么请检查web服务
公共静态字符串身份验证(字符串用户名、字符串密码)
{
字符串success=null;
ArrayList=新建ArrayList();
SoapObject请求=新的SoapObject(WSDL\u目标\u命名空间、操作\u登录);
PropertyInfo PropertyInfo=新的PropertyInfo();
propertyInfo.setName(“用户名”);
propertyInfo.setValue(用户名);
propertyInfo.setType(String.class);
request.addProperty(propertyInfo,用户名)
PropertyInfo propertyInfo1=newpropertyinfo();
propertyInfo1.setName(“密码”);
propertyInfo1.setValue(密码);
propertyInfo1.setType(String.class);
request.addProperty(propertyInfo1,密码);
SoapSerializationEnvelope=新的SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet=true;
envelope.setOutputSoapObject(请求);
SoapObject结果=null;
HttpTransportSE htse=新的HttpTransportSE(SOAP\U地址);
试一试{
htse.debug=true;
调用(SOAP\u ACTIONLogin,信封);
结果=(SoapObject)envelope.bodyIn;
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}catch(XMLPullParseRexE){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
SoapObject根=(SoapObject)结果.getProperty(0);
soapobjects s_deals=(SoapObject)root.getProperty(“diffgram”);
SoapObject s_deals_1=(SoapObject)s_deals.getProperty(“NewDataSet”);
对于(int i=0;i
您必须检查返回类型asp.net数据表,然后检查返回newDataSet或DocumentElement…如果未返回这些内容,则检查web服务
公共静态字符串身份验证(字符串用户名、字符串密码)
{
字符串success=null;
ArrayList=新建ArrayList();
SoapObject请求=新的SoapObject(WSDL\u目标\u命名空间、操作\u登录);
PropertyInfo PropertyInfo=新的PropertyInfo();
propertyInfo.setName(“用户名”);
propertyInfo.setValue(用户名);
propertyInfo.setType(String.class);
request.addProperty(propertyInfo,用户名)
PropertyInfo propertyInfo1=newpropertyinfo();
propertyInfo1.setName(“密码”);
propertyInfo1.setValue(密码);
propertyInfo1.setType(String.class);
request.addProperty(propertyInfo1,密码);
SoapSerializationEnvelope=新的SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet=true;
envelope.setOutputSoapObject(请求);
SoapObject结果=null;
HttpTransportSE htse=新的HttpTransportSE(SOAP\U地址);
试一试{
htse.debug=true;
调用(SOAP\u ACTIONLogin,信封);
结果=(SoapObject)envelope.bodyIn;
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}catch(XMLPullParseRexE){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
SoapObject根=(SoapObject)结果.getProperty(0);
soapobjects s_deals=(SoapObject)root.getProperty(“diffgram”);
SoapObject s_deals_1=(SoapObject)s_deals.getProperty(“NewDataSet”);
对于(int i=0;i <xs:schema elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/System.Data" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://schemas.datacontract.org/2004/07/System.Data">
<xs:element name="DataTable" nillable="true">
<xs:complexType>
<xs:annotation>
<xs:appinfo>
<ActualType Name="DataTable" Namespace="http://schemas.datacontract.org/2004/07/System.Data" xmlns="http://schemas.microsoft.com/2003/10/Serialization/" />
</xs:appinfo>
</xs:annotation>
<xs:sequence>
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="http://www.w3.org/2001/XMLSchema" processContents="lax" />
<xs:any minOccurs="1" namespace="urn:schemas-microsoft-com:xml-diffgram-v1" processContents="lax" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
PropertyInfo propertyInfo1 = new PropertyInfo();
propertyInfo1.setName("password");
propertyInfo1.setValue(password);
propertyInfo1.setType(String.class);
request.addProperty(propertyInfo1,password);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
SoapObject result = null;
HttpTransportSE htse = new HttpTransportSE(SOAP_ADDRESS);
try {
htse.debug = true;
htse.call(SOAP_ACTIONLogin, envelope);
result =(SoapObject) envelope.bodyIn;
} catch (IOException e){
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XmlPullParserException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
SoapObject root = (SoapObject) result.getProperty(0);
SoapObject s_deals = (SoapObject) root.getProperty("diffgram");
SoapObject s_deals_1 = (SoapObject)s_deals.getProperty("NewDataSet");
for (int i = 0; i < s_deals_1.getPropertyCount(); i++) {
Object property = s_deals_1.getProperty(i);
if (property instanceof SoapObject) {
SoapObject category_list = (SoapObject)property;
String EmpID = category_list.getProperty("EmpId").toString();
String UserName = category_list.getProperty("MstEmpName").toString();
LoginModel lm=new LoginModel();
lm.setEmpID(EmpID);
lm.setUserName(UserName);
list.add(lm);
if(list!=null)
{
success="valid";
}
Log.e("name",UserName);
Log.e("EmpID",EmpID);
}
}