从android客户端向wcf服务发送复杂类型时,服务器接收空值

从android客户端向wcf服务发送复杂类型时,服务器接收空值,android,wcf,ksoap2,Android,Wcf,Ksoap2,我正在使用ksoap2库连接到wcf web服务。当我尝试发送基元类型时,服务器会获取这些值并发送正确的响应。但是,如果尝试发送复杂类型(KVMSerilizable的子类型的对象),服务器将接收null。 下面是我要发送的对象的类定义 import java.util.Hashtable; import org.ksoap2.serialization.KvmSerializable; import org.ksoap2.serialization.PropertyInfo; public

我正在使用ksoap2库连接到wcf web服务。当我尝试发送基元类型时,服务器会获取这些值并发送正确的响应。但是,如果尝试发送复杂类型(KVMSerilizable的子类型的对象),服务器将接收null。 下面是我要发送的对象的类定义

import java.util.Hashtable;

import org.ksoap2.serialization.KvmSerializable;
import org.ksoap2.serialization.PropertyInfo;

public class TwoIntegerWrapper implements KvmSerializable {

    private int Num1;
    private int Num2;

    public TwoIntegerWrapper() {
        super();
    }

    TwoIntegerWrapper(int number1, int number2) {
        super();
        this.Num1 = number1;
        this.Num2 = number2;
    }

    public int getNumber1() {
        return Num1;
    }

    public void setNumber1(int number1) {
        this.Num1 = number1;
    }

    public int getNumber2() {
        return Num2;
    }

    public void setNumber2(int number2) {
        this.Num2 = number2;
    }

    public Object getProperty(int propertyNumber) {

        Object property = null;

        switch (propertyNumber) {
        case 0:
            property = this.Num1;
            break;

        case 1:
            property = this.Num2;
            break;

        }

        return property;
    }

    public int getPropertyCount() {
        return 2;
    }

    public void getPropertyInfo(int propertyNumber, Hashtable arg1,
            PropertyInfo propertyInfo) {

        switch (propertyNumber) {
        case 0:
            propertyInfo.type = PropertyInfo.INTEGER_CLASS;
            propertyInfo.name = "Num1";
            break;
        case 1:
            propertyInfo.type = PropertyInfo.INTEGER_CLASS;
            propertyInfo.name = "Num2";
            break;
        }

    }

    public void setProperty(int propertyNumber, Object data) {
        switch (propertyNumber) {

        case 0:
            this.Num1 = Integer.parseInt(data.toString());
            break;
        case 1:
            this.Num2 = Integer.parseInt(data.toString());
            break;
        }

    }
}
下面是我如何称呼web服务的

SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

PropertyInfo property = new PropertyInfo();
TwoIntegerWrapper tiw = new TwoIntegerWrapper(num1Value, num2Value);

property.setName("TwoIntegerWrapper");
property.setType(tiw.getClass());
property.setValue(tiw);

request.addProperty(property);

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

envelope.addMapping(NAMESPACE, tiw.getClass().getSimpleName(), TwoIntegerWrapper.class);

HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
androidHttpTransport.debug = true;

try {
    androidHttpTransport.call(Add_SOAP_ACTION, envelope);

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


   SoapPrimitive sp = (SoapPrimitive) envelope.getResponse();
   result = Integer.parseInt(sp.toString());
}

可能的原因是什么?

一个常见的问题是,假设您通过网络发送XML,则XML位于错误的命名空间中。在这种情况下,WCF反序列化程序将确定XML中没有它所知道的任何内容,并返回
null

一个常见的问题是,假设您通过网络发送XML,则XML位于错误的命名空间中。在这种情况下,WCF反序列化程序将确定XML中没有它所知道的任何内容,并返回
null
,我建议使用检查请求并进行响应


在WCF服务上启用,并通过检查跟踪文件查看频道上出现的消息。

我建议使用检查请求并响应


在WCF服务上启用,并通过检查跟踪文件查看频道上出现的消息。

确定基于xsd2实现KVMSerizable的类是准确的。 但是,对于AddNumbers2、AddNumbers3的方法(消息),首先有一个元素具有元素类型复杂类型,例如:


好的,实现KVMSerizable的类基于xsd2是准确的。 但是,对于AddNumbers2、AddNumbers3的方法(消息),首先有一个元素具有元素类型复杂类型,例如:


我通过更改TwoIntegerRapper类的getPropertyInfo函数找到了解决方案。我还为此类中的每个属性设置名称空间。新的实施措施如下:

public void getPropertyInfo(int propertyNumber, Hashtable arg1,
        PropertyInfo propertyInfo) {

    switch (propertyNumber) {
    case 0:
        propertyInfo.type = PropertyInfo.INTEGER_CLASS;
        propertyInfo.name = "Num1";
        propertyInfo.setNamespace(TWO_INTEGER_WRAPPER_NAMESPACE);
        break;
    case 1:
        propertyInfo.type = PropertyInfo.INTEGER_CLASS;
        propertyInfo.name = "Num2";
        propertyInfo.setNamespace(TWO_INTEGER_WRAPPER_NAMESPACE);
        break;
    }

}
即使我从封套中删除映射,它也可以工作。我不明白为什么会这样,但它是有效的。如果有人解释原因,我将不胜感激。Wsdl文件、xsd0、xsd1和xsd2文件位于链接中

顺便说一下,我也变了

property.setName("TwoIntegerWrapper");  


我通过更改TwoIntegerRapper类的getPropertyInfo函数找到了解决方案。我还为此类中的每个属性设置名称空间。新的实施措施如下:

public void getPropertyInfo(int propertyNumber, Hashtable arg1,
        PropertyInfo propertyInfo) {

    switch (propertyNumber) {
    case 0:
        propertyInfo.type = PropertyInfo.INTEGER_CLASS;
        propertyInfo.name = "Num1";
        propertyInfo.setNamespace(TWO_INTEGER_WRAPPER_NAMESPACE);
        break;
    case 1:
        propertyInfo.type = PropertyInfo.INTEGER_CLASS;
        propertyInfo.name = "Num2";
        propertyInfo.setNamespace(TWO_INTEGER_WRAPPER_NAMESPACE);
        break;
    }

}
即使我从封套中删除映射,它也可以工作。我不明白为什么会这样,但它是有效的。如果有人解释原因,我将不胜感激。Wsdl文件、xsd0、xsd1和xsd2文件位于链接中

顺便说一下,我也变了

property.setName("TwoIntegerWrapper");  


名称空间是正确的。如果不是,发送原语类型会起作用吗?(因为它与基元类型一起工作。)您控制服务吗?如果是这样,您可以打开消息日志记录和跟踪,以查看服务端名称空间上发生的情况是否正确。如果不是,发送原语类型会起作用吗?(因为它与基元类型一起工作。)您控制服务吗?如果是这样的话,您可以打开消息日志记录和跟踪来查看服务端发生的情况。如果服务器接收到空对象,则会返回一些wsdl和wt错误。我的请求转储是以下tempuri.org/“>13i需要查看您的wsdl,而不仅仅是requestDump,至少是“TwoIntegerRapper”的消息部分,以查看您在上面的代码定义中是否有任何错误。这是web服务wsdl。好的,现在有一些“xsd”部分我无法访问,因为它的本地主机是“”“如果服务器接收到空对象,您是否可以打开并粘贴它们?如果服务器接收到空对象,将返回一些wsdl和wt错误。我的请求转储是以下tempuri.org/“>13i需要查看您的wsdl,而不仅仅是requestDump,至少是“TwoIntegerRapper”的消息部分,以查看您在上面的代码定义中是否有任何错误。这是web服务wsdl。好的,现在有一些“xsd”部分我无法访问,因为它的本地主机是“”“你能打开每一个并粘贴它们吗?我试过了,但这碰巧不是问题。问题是服务代码中没有写入[DataContract]和[DataMember]注释。(因此服务器无法反序列化我发送的内容)。解决此问题后,代码使用asmx服务将property.setName(“TwoIntegerRapper”)更改为property.setName(“obj”)。但wcf服务的问题仍然存在。但是,这次它没有接收null,而是始终接收(0,0)。问题是服务代码中没有写入[DataContract]和[DataMember]注释。(因此服务器无法反序列化我发送的内容)。解决此问题后,代码使用asmx服务将property.setName(“TwoIntegerRapper”)更改为property.setName(“obj”)。但wcf服务的问题仍然存在。然而,这次它并没有接收null,它总是接收(0,0)。您能告诉我“两个整数包装器名称空间”的值是多少吗。我也面临同样的问题。你们能告诉我“两个整数包装器名称空间”的值是多少吗。我也面临同样的问题。
property.setName("obj");