我正在使用Java Web服务端点在Visual Studio 2008中编写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>
但是,它实际上并不解析这两个值,之后的所有值都为null。调试后,我发现自动生成的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服务代理?
答案 0 :(得分:2)
在处理了类似的事情并且知道这是一个巨大的痛苦之后,我建议创建自己的“假”WSDL,它反映了从Web服务实际返回的内容而不是指定的内容。该问题似乎更多地涉及作为WSDL一部分的不准确的XSD。似乎默认情况下,某些Java Web服务框架不严格遵循订单(或其他规范),并且您的第三方Web服务提供商可能没有解决问题的知识,资源或动机。
作为最佳实践,最好不要将WSDL作为服务引用导入,而是手动或使用WCF服务配置编辑器手动创建接口和服务代理。关于如何做到这一点有很多资源 - 谷歌是你的朋友。