Bha*_*kar 9 c# java web-services
我有Java Web服务,一个Web方法的参数是自定义Java类型
public class KeyList {
public Integer key;
public Integer[] nums ;
public Integer result;
}
Run Code Online (Sandbox Code Playgroud)
Web服务更新Result值并将KeyList对象返回给客户端.
我有一个这个Web服务的C#客户端(通过添加服务引用并指向wsdl url在Visual Studio中生成).当我在C#中收到keyList对象时,第一部分(整数键)出现为0.如果我在KeyList类型中更改Java自定义类型以使用int键(而不是Integer Key),那么它对C#工作正常客户.
我想看看两种情况(使用int和Integer)wsdl是否完全不同,但事实证明唯一的区别是minOccurs属性.
使用Integer键时
<xs:element name="key" type="xs:int" minOccurs="0" />
Run Code Online (Sandbox Code Playgroud)
当使用int键时
<xs:element name="key" type="xs:int" />
Run Code Online (Sandbox Code Playgroud)
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; }
Run Code Online (Sandbox Code Playgroud)
}
java中的整数可以为null,这就是你看到的原因minOccurs="0".int不能为null,这就是为什么缺少minOccurs的原因.在C#int(或Int32,它是相同的)不能为空,所以它不期望minOccurs="0".问题很可能是在Visual Studio代理生成器中.
它应该在C#(或or )中为此元素生成nullable int :Int32?int?Nullable<Int32>
<xs:element name="key" type="xs:int" minOccurs="0" />
Run Code Online (Sandbox Code Playgroud)
根据您生成此代理的方式,Visual Studio可能添加了名为"keySpecified"的其他bool字段.它有时会为可空字段的名称添加"指定"后缀.它希望你写这样的代码:
if(res.keySpecified){
// use res.Key
} else {
// assume res.Key is null
}
Run Code Online (Sandbox Code Playgroud)
如果尚未生成'keySpecified',您可以查看使用svcutil生成代理.它有比Visual Studio中公开的选项多得多的选项.另一个可能的解决方案是在java端坚持使用int,因为它直接映射到C#端的int.