我有Java Web服务,一个Web方法的参数是自定义Java类型
public class KeyList {
public Integer key;
public Integer[] nums ;
public Integer result;
}
Web服务更新Result值并将KeyList对象返回给客户端。
我有一个这个Web服务的C#客户端(通过添加服务引用并指向wsdl url在Visual Studio中生成)。当我在C#中收到keyList对象时,第一部分(整数键)变为0。 如果我将Java自定义类型更改为在KeyList类型中使用int键(而不是Integer Key),那么它对C#客户端工作正常。
我想看看wsdl在两种情况下是否完全不同(使用int和Integer),但事实证明唯一的区别是minOccurs属性。
使用Integer键时
<xs:element name="key" type="xs:int" minOccurs="0" />
使用int键时
<xs:element name="key" type="xs:int" />
C#客户端在服务的返回值中没有正确接收更新的Integer的原因是什么?毋庸置疑,它无论如何都适用于Java客户端。
编辑: VS为KeyList生成的C#类:
public class keyList:INotifyPropertyChanged {
private int keyField;
private bool keyFieldSpecified;
private int?[] numsField;
private PropertyChangedEventHandler PropertyChanged;
private int resultField;
private bool resultFieldSpecified;
public event PropertyChangedEventHandler PropertyChanged;
public keyList();
protected void RaisePropertyChanged(string propertyName);
[XmlElement(Form=XmlSchemaForm.Unqualified, Order=0)]
public int key { get; set; }
[XmlElement("nums", Form=XmlSchemaForm.Unqualified, IsNullable=true, Order=1)]
public int?[] nums { get; set; }
[XmlElement(Form=XmlSchemaForm.Unqualified, Order=2)]
public int result { get; set; }
[XmlIgnore]
public bool resultSpecified { get; set; }
}
答案 0 :(得分:7)
Integer 可以为null,这就是您看到minOccurs="0"
的原因。 int 不能为null,这就是为什么缺少minOccurs的原因。在C#int(或相同的Int32)中不能为null,因此不期望minOccurs="0"
。问题很可能出在Visual Studio代理生成器中。
它应该在C#(Int32?
或int?
或Nullable<Int32>
)中为此元素生成nullable int:
<xs:element name="key" type="xs:int" minOccurs="0" />
根据您生成此代理的方式,Visual Studio可能添加了名为“keySpecified”的其他bool字段。它有时会为可空字段的名称添加“指定”后缀。它希望你写这样的代码:
if(res.keySpecified){
// use res.Key
} else {
// assume res.Key is null
}
如果尚未生成'keySpecified',您可以查看使用svcutil生成代理。它有比Visual Studio中公开的选项多得多的选项。另一个可能的解决方案是在java端坚持使用int,因为它直接映射到C#端的int。