从android客户端向wcf服务发送复杂类型时,服务器接收空值
我正在使用ksoap2库连接到wcf web服务。当我尝试发送基元类型时,服务器会获取这些值并发送正确的响应。但是,如果尝试发送复杂类型(KVMSerilizable的子类型的对象),服务器将接收null。 下面是我要发送的对象的类定义从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
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");