我正在 Visual Studio 2008 中使用 Java Web 服务端点编写 C# Web 服务客户端。我无法控制端点及其发回的 SOAP 消息。
我使用 Visual Studio 中的“添加服务引用”选项从 Web 服务 WSDL 创建了一个自动生成的代理客户端。当我发送我的请求时,我会收到一条有效的 SOAP 消息,其中包含如下内容:
<java:a_field xmlns:java="java:com.whatever">Value1</java:a_field>
<java:different_field xmlns:java="java:com.whatever">Value2</java:different_field>
但是,它实际上并没有解析这两个值,并且之后的所有值都是空的。经过调试,我发现自动生成的Reference.cs中的这段代码是问题所在:
[System.Xml.Serialization.XmlElementAttribute(IsNullable=true, Order=30)]
public string different_field {
get {
return this.different_fieldField;
}
set {
this.different_fieldField = value;
this.RaisePropertyChanged("different_field");
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(IsNullable=true, Order=31)]
public string a_field {
get {
return this.a_fieldField;
}
set {
this.a_fieldField = value;
this.RaisePropertyChanged("a_field");
}
}
这两个字段是乱序的,所以它没有正确序列化它们,其余的字段根本没有序列化。WSDL 本身以代理类期望它们的相同顺序声明字段,改变顺序的只是实际响应。我可以通过手动交换两个 Order= 值来解决此问题,但鉴于 WSDL 经常更改并且需要检查 100 多个字段是否存在此类错误,这将是一个巨大的麻烦。有没有更好的方法让我能够忽略这种排序不匹配并仍然使用自动生成的 Web 服务代理?