其他分享
首页 > 其他分享> > 使用kso​​ap2从android传递对象到wcf soap服务;它发送和接收0

使用kso​​ap2从android传递对象到wcf soap服务;它发送和接收0

作者:互联网

我试图使用kso​​ap2来访问来自android的wcf soap服务中的方法.
我能够成功地将简单类型参数传递给方法,它工作正常.
但是当我尝试传递对象时,wcf方法对所有对象值都接收0.

我在WP7应用程序中使用了相同的SOAP服务,运行正常.

我的服务中有2个方法,ksoapadd和addParam. addParam接受两个整数并返回它们的总和(这是有效的). ksoapadd接受类testadd的对象,它有两个整数元素,ksoapadd返回它们的总和(这得到并发送0).

我认为这与命名空间有关,但我无法弄清楚如何解决它.我一直在做试验和错误,以获得正确的肥皂请求,但没有运气.

任何人都可以帮我弄清楚该怎么办?我尝试了很多选项,以某种方式帮助其他有类似问题的人,但无济于事.

这是我的wsdl:

<?xml version="1.0" encoding="UTF-8"?>
-<wsdl:definitions xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex"
xmlns:wsa10="http://www.w3.org/2005/08/addressing" 
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" 
xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" 
xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" 
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" 
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" 
xmlns:tns="http://tempuri.org/" 
xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" 
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" 
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
targetNamespace="http://tempuri.org/" name="Service1">
-<wsdl:types>
-<xsd:schema targetNamespace="http://tempuri.org/Imports">
<xsd:import namespace="http://tempuri.org/" schemaLocation="http://localhost:51086/Service1.svc?xsd=xsd0"/>
<xsd:import namespace="http://schemas.microsoft.com/2003/10/Serialization/" schemaLocation="http://localhost:51086/Service1.svc?xsd=xsd1"/>
<xsd:import namespace="http://schemas.datacontract.org/2004/07/InsertIntoUserWCF" schemaLocation="http://localhost:51086/Service1.svc?xsd=xsd2"/>
</xsd:schema>
</wsdl:types>
-<wsdl:message name="IService1_ksoapAdd_InputMessage">
<wsdl:part name="parameters" element="tns:ksoapAdd"/>
</wsdl:message>
-<wsdl:message name="IService1_ksoapAdd_OutputMessage">
<wsdl:part name="parameters" element="tns:ksoapAddResponse"/>
</wsdl:message>
-<wsdl:message name="IService1_addParam_InputMessage">
<wsdl:part name="parameters" element="tns:addParam"/>
</wsdl:message>
-<wsdl:message name="IService1_addParam_OutputMessage">
<wsdl:part name="parameters" element="tns:addParamResponse"/>
</wsdl:message>
-<wsdl:portType name="IService1">
-<wsdl:operation name="ksoapAdd">
<wsdl:input message="tns:IService1_ksoapAdd_InputMessage"    wsaw:Action="http://tempuri.org/IService1/ksoapAdd"/>
<wsdl:output message="tns:IService1_ksoapAdd_OutputMessage" wsaw:Action="http://tempuri.org/IService1/ksoapAddResponse"/>
</wsdl:operation>
-<wsdl:operation name="addParam">
<wsdl:input message="tns:IService1_addParam_InputMessage" wsaw:Action="http://tempuri.org/IService1/addParam"/>
<wsdl:output message="tns:IService1_addParam_OutputMessage" wsaw:Action="http://tempuri.org/IService1/addParamResponse"/>
</wsdl:operation>
</wsdl:portType>
-<wsdl:binding name="BasicHttpBinding_IService1" type="tns:IService1">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
-<wsdl:operation name="InsertUserDetails">
<soap:operation style="document" 
-<wsdl:operation name="ksoapAdd">
<soap:operation style="document" soapAction="http://tempuri.org/IService1/ksoapAdd"/>
-<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
-<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
-<wsdl:operation name="addParam">
<soap:operation style="document" soapAction="http://tempuri.org/IService1/addParam"/>
-<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
-<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
-<wsdl:service name="Service1">
-<wsdl:port name="BasicHttpBinding_IService1" binding="tns:BasicHttpBinding_IService1">
<soap:address location="http://localhost:51086/Service1.svc"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

这是我的xsd2:

<?xml version="1.0" encoding="UTF-8"?>
-<xs:schema xmlns:tns="http://schemas.datacontract.org/2004/07/InsertIntoUserWCF"
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
targetNamespace="http://schemas.datacontract.org/2004/07/InsertIntoUserWCF" 
elementFormDefault="qualified">
-<xs:complexType name="testadd">
-<xs:sequence>
<xs:element name="number_1" type="xs:int" minOccurs="0"/>
<xs:element name="number_2" type="xs:int" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:element name="testadd" type="tns:testadd" nillable="true"/>
</xs:schema>

这是我的肥皂要求:

<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
<v:Header />
<v:Body>
<ksoapAdd xmlns="http://tempuri.org/" id="o0" c:root="1">
<n0:num1 xmlns:n0="http://tempuri.org/">
<number_1>25</number_1>
<number_2>25</number_2>
</n0:num1>
</ksoapAdd>
</v:Body>
</v:Envelope>

肥皂反应:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<ksoapAddResponse xmlns="http://tempuri.org/">
<ksoapAddResult>0</ksoapAddResult>
</ksoapAddResponse>
</s:Body>
</s:Envelope>

这是我使用kso​​ap2的java代码:

private static final String NAMESPACE = "http://tempuri.org/";
private static final String URL = "http://10.0.2.2:51086/Service1.svc?wsdl";
private static final String SOAP_ACTION4 = "http://tempuri.org/IService1/ksoapAdd";
private static final String METHOD_NAME4 = "ksoapAdd";
private static final String SOAP_ACTION5 = "http://tempuri.org/IService1/addParam";
private static final String METHOD_NAME5 = "addParam";

try {
    testadd numX = new testadd(25,25);

    SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME4);

    PropertyInfo prop = new PropertyInfo();
    prop.setNamespace(NAMESPACE);
    prop.setName("num1");
    prop.setType(numX.getClass());
    prop.setValue(numX);
    Request.addProperty(prop);

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet = true;
    envelope.setOutputSoapObject(Request);

    envelope.implicitTypes = true;

    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
    androidHttpTransport.debug=true;
    androidHttpTransport.call(SOAP_ACTION4, envelope);

    Log.d(logtag + " request dump", androidHttpTransport.requestDump);
    Log.d(logtag + " response dump", androidHttpTransport.responseDump);

    final SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
    final int num = Integer.parseInt(response.toString());

    } catch (Exception e) 
    {
        e.printStackTrace();
    }

这是我的java类testadd:

import java.util.Hashtable;
import org.ksoap2.serialization.KvmSerializable;
import org.ksoap2.serialization.PropertyInfo;

public class testadd implements KvmSerializable{
int number1;
int number2;

testadd(){}
testadd(int a, int b){ number1 = a; number2 = b;}


@Override
public Object getProperty(int arg0) {
    switch(arg0)
    {
    case 0:
        return number1;
    case 1:
        return number2;

    }

return null;
}

@Override
public int getPropertyCount() {

    return 2;
}

@Override
public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) {

     switch(arg0)
        {
        case 0:
            arg2.type = PropertyInfo.INTEGER_CLASS;
            arg2.name = "number_1";
            break;
        case 1:
            arg2.type = PropertyInfo.INTEGER_CLASS;
            arg2.name = "number_2";
            break;

        default:break;
        }

}

@Override
public void setProperty(int arg0, Object value) {

    switch(arg0)
    {
    case 0:
       number1 = Integer.parseInt(value.toString());
        break;
    case 1:
        number2 = Integer.parseInt(value.toString());
        break;

    default:
        break;
    }
}
}

服务代码:

<ServiceContract()> _
Public Interface IService1
<OperationContract()> _
Function ksoapAdd(ByVal num1 As testadd) As Integer

<OperationContract()> _
Function addParam(ByVal num1 As Integer, ByVal num2 As Integer) As Integer

End Interface

<DataContract()> _
Public Class testadd
Private number1 As Integer
Private number2 As Integer

<DataMember()> _
Public Property number_1() As Integer
    Get
        Return number1
    End Get
    Set(ByVal value As Integer)
        number1 = value
    End Set
End Property

<DataMember()> _
Public Property number_2() As Integer
    Get
        Return number2
    End Get
    Set(ByVal value As Integer)
        number2 = value
    End Set
End Property

End Class

服务方式:

Public Function ksoapAdd(ByVal num1 As testadd) As Integer Implements IService1.ksoapAdd
    MsgBox(num1.number_1)
    Return num1.number_1 + num1.number_2
End Function

Public Function addParam(ByVal num1 As Integer, ByVal num2 As Integer) As Integer Implements IService1.addParam
    MsgBox(num1 + num2)
    Return num1 + num2
End Function

我知道这是很多代码,但它认为有必要了解整个图片.

谢谢!

解决方法:

我终于开始工作了!

原来我的android ksoap2代码不喜欢WCF在SOAP服务中设置的默认命名空间(tempuri.org).

我的猜测是,使用默认命名空间,请求信封无法将传递的testadd对象映射到在服务中定义testadd类的datacontract.通过明确定义WCF服务中的servicecontract和datacontract的名称空间,这会更改/重新排列wsdl并使datacontract可访问.

我按照本教程摆脱了tempuri.org名称空间 –
http://blogs.msdn.com/b/endpoint/archive/2011/05/12/how-to-eliminate-tempuri-org-from-your-service-wsdl.aspx

我在服务代码(VB)的适当位置添加了以下内容

<ServiceContract(Namespace:="http://wcfservicetest.org/Service1")> _
<DataContract(Namespace:="http://wcfservicetest.org/Service1")> _
<ServiceBehavior(Namespace:="http://wcfservicetest.org/Service1")> _

我将我的命名空间更改为“http://wcfservicetest.org/Service1”,并使用新的命名空间在android java代码中编辑了NAMESPACE和SOAP_ACTION.

这样做后,我得到了我想要的结果!

这是肥皂要求:

<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
<v:Header />
<v:Body>
<ksoapAdd xmlns="http://wcfservicetest.org/Service1" id="o0" c:root="1">
<n0:num1 xmlns:n0="http://wcfservicetest.org/Service1">
<number_1>25</number_1>
<number_2>25</number_2>
</n0:num1>
</ksoapAdd>
</v:Body>
</v:Envelope>

肥皂反应:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<ksoapAddResponse xmlns="http://wcfservicetest.org/Service1">
<ksoapAddResult>50</ksoapAddResult>
</ksoapAddResponse>
</s:Body>
</s:Envelope>

所以我建议其他人使用kso​​ap2学习SOAP服务,不要使用默认命名空间,设置自己的命名空间.我浪费了一周时间试图解决这个问题.

希望有一天能帮到某人!

标签:ksoap2,android,vb-net,soap,wcf
来源: https://codeday.me/bug/20190927/1823539.html