Java Web Service的C#客户端 - 数据互操作性问题

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)

}

Dmi*_*try 7

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.