gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:36:45 27 4
gpt4 key购买 nike

我正在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com