8

我正在 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 服务代理?

4

1 回答 1

4

在处理了类似的事情之后,并且知道这是一个巨大的痛苦,我建议创建您自己的“假”WSDL,以反映从 Web 服务实际返回的内容,而不是指定的内容。该问题似乎更多地与作为 WSDL 一部分的不准确 XSD 有关。似乎某些 Java Web 服务框架默认不严格遵循顺序(或其他规范),并且您的第三方 Web 服务提供商可能没有知识、资源或动机来解决问题。

作为最佳实践,最好不要将 WSDL 作为服务引用导入,而是手动或使用 WCF 服务配置编辑器手动创建接口和服务代理以及配置。有很多关于如何做到这一点的资源——谷歌是你的朋友。

于 2014-09-01T18:24:05.797 回答