c# - 添加服务引用 : Ordering of Serialization Fields

标签 c# wcf web-services soap wsdl

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

最佳答案

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

作为最佳实践,最好不要将 WSDL 作为服务引用导入,而是手动创建接口(interface)和服务代理,并手动或使用 WCF 服务配置编辑器进行配置。有很多关于如何执行此操作的资源 - Google 是您的 friend 。

关于c# - 添加服务引用 : Ordering of Serialization Fields,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16489138/

相关文章:

java - 在生成的 Restful Web 服务中获取更多查询

c# - Actor 模型和 Web 服务/消息队列之间的区别

C# 407 需要代理身份验证

c# - 在 PropertyGrids 中是否有更好的 StringCollection 编辑器?

java - 无法使用 https 协议(protocol) (ssl) 访问网络服务

c# - 使用 WCF 服务从 ASP.NET 应用程序进行串行端口通信

c# - 服务器未提供有意义的回复,这可能是由于契约(Contract)不匹配、 session 过早关闭或内部服务器错误造成的

java - 如何在C#中模拟Java泛型通配符

c# - T4 模板 - 从实现接口(interface)的类生成单元测试类

wcf - MVC2 路由与 WCF ServiceRoute : Html. ActionLink 呈现不正确的链接!