问题描述
我是新来这个网站和放大器; Android的,如果有任何错误,请注明我。我的问题是在SOAP响应,
I am new to this site & Android, If there are any wrong please indicate me . My problem is in soap response,
这是我的Android code:
This is my Android code:
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;
}
这是C#的方法:
public DataTable LoadDownLoadTables(string strExec, string strBusinessUnit)
{
DataTable dtDownload = new DataTable();
try
{
XontPDAServiceDAL vu = new XontPDAServiceDAL();
if (vu.validateExecutive(strBusinessUnit, strExec) == true)
{
DownloadFetchBLL wmd = new DownloadFetchBLL();
dtDownload = wmd.LoadDownLoadTable(strBusinessUnit, strExec);
}
else
{
throw new FaultException("Executive Not Active in the system.");
}
}
catch (FaultException) { }
catch (Exception ex)
{
throw new FaultException("Database Server is Not Responding.");
}
return dtDownload;
}
这是我的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{};元素= anyType的{};元素= anyType的{};元素= anyType的{};元素= anyType的{}; }; }; }; }; }; }; }
请帮我..
推荐答案
你可以控制你的WCF服务(=你可以改变它)?如果是改变你的服务来回报自己的自定义类的一些阵列/列表重新在你的数据表presenting行,并填写从数据表中的这些实例的服务操作。
Do you have control over your WCF service (= can you change it)? If yes change your service to return some array / list of your own custom classes representing rows in your data table and fill these instances from data table in the service operation.
数据表
和的DataSet
是不是互操作解决方案不错的选择。您通过邮件看起来更像是一些反序列化XSD的(也可以是可能的,因为数据表
可以转移其描述作为其序列化数据的一部分)。
DataTable
and DataSet
are not good choice for interoperable solution. Your passed message looks more like some "deserialization" of XSD (it can be possible because DataTable
can transfer its description as part of its serialized data).
这篇关于Android的使用WCF,该特定方法返回的DataTable的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!