添加服务参考:序列化字段的排序

Chr*_*ham 7 c# wcf soap wsdl web-services

我正在使用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>
Run Code Online (Sandbox Code Playgroud)

但是,它实际上并不解析这两个值,之后的所有值都为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");
    }
}
Run Code Online (Sandbox Code Playgroud)

这两个字段乱序,因此它没有正确序列化,其余字段根本没有序列化.WSDL本身按照代理类期望的顺序声明字段,它只是改变顺序的实际响应.我可以通过手动交换两个Order =值来解决这个问题,但考虑到WSDL经常更改并且有100个字段需要检查这种错误,这将是一个巨大的痛苦.有没有更好的方法让我能够忽略这种排序不匹配,仍然使用自动生成的Web服务代理?

And*_*rew 4

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

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

  • 在我看来,SOAP 对于 Web 服务的唯一可取之处在于它允许自动生成解析代码,为数百个字段编写解析代码将比处理这些排序问题需要更多的工作。手工修改的 WSDL 文件涉及的工作量比手工修改代码的工作量要少一些,这就是我在发布此答案之前最终所做的工作。 (3认同)