【问题标题】:C# client for Java Web Service - data interoperability issueJava Web 服务的 C# 客户端 - 数据互操作性问题
【发布时间】:2011-10-27 11:47:12
【问题描述】:

我有 Java Web 服务,一个 Web 方法的参数是自定义 Java 类型

public class KeyList {
public Integer key;
public Integer[] nums ;
public Integer result;
}

Web 服务更新 Result 值并将 KeyList 对象返回给客户端。

我有这个 Web 服务的 C# 客户端(在 Visual Studio 中通过添加服务引用并指向 wsdl url 生成)。当我在 C# 中收到 keyList 对象时,第一部分(整数键)显示为 0。 如果我将 Java 自定义类型更改为在 KeyList 类型中使用 int 键(而不是 Integer Key ),那么它适用于 C# 客户端。

我想看看这两种情况(使用 int 和 Integer)的 wsdl 是否有很大不同,但事实证明,唯一的区别是 minOccurs 属性。

使用整数键时

<xs:element name="key" type="xs:int" minOccurs="0" /> 

使用int键时

<xs:element name="key" type="xs:int" /> 

C# 客户端无法正确接收服务返回值中更新的 Integer 的原因是什么?不用说,无论哪种方式,它都适用于 Java 客户端。


编辑: VS为KeyList生成的C#类:

公共类 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; }

}

【问题讨论】:

  • 这确实是一个 c# 问题,而不是 Java 问题 - 您的问题主要涉及 c# 客户端的行为,而不是 java 客户端的行为。重新标记。
  • 你能发布 Visual Studio 为你生成的课程吗?
  • 另外,这是使用“添加服务引用”还是“添加 Web 引用”完成的?

标签: c# java web-services


【解决方案1】:

Integer 在 java 中可以为 null,这就是您看到 minOccurs="0" 的原因。 int 不能为空,这就是缺少 minOccurs 的原因。在 C# 中,int(或相同的 Int32)不能为 null,因此它不期望 minOccurs="0"。问题很可能出在 Visual Studio 代理生成器中。

它应该在 C# 中为该元素生成 nullable int(Int32?int?Nullable&lt;Int32&gt;):

<xs:element name="key" type="xs:int" minOccurs="0" /> 

根据您生成此代理的方式,Visual Studio 可能添加了名为“keySpecified”的额外布尔字段。它有时会在可为空字段的名称中添加“指定”后缀。它希望您编写如下代码:

if(res.keySpecified){
    // use res.Key
} else {
    // assume res.Key is null
}

如果“keySpecified”尚未生成,您可以查看使用svcutil 生成代理。它比 Visual Studio 中提供的选项多得多。另一个可能的解决方案是在 java 端坚持使用 int,因为它直接映射到 C# 端的 int。

【讨论】:

  • 为密钥指定 keySpecified=true 会从服务返回正确的值。谢谢!
  • 你是男人德米特里。被这个问题困扰了2天。终于可以解决了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
  • 1970-01-01
  • 2014-09-04
  • 2012-03-15
  • 2019-02-25
  • 2018-11-30
  • 1970-01-01
相关资源
最近更新 更多