【问题标题】:.net, soap, web services, How to override the serialization\conversion in a web reference.net、soap、Web 服务、如何在 Web 参考中覆盖序列化\转换
【发布时间】:2011-03-29 12:27:45
【问题描述】:

我正在访问一个用 php 编写的第三方 Web 服务。 服务 wsdl 作为 Web 参考添加到我的项目中,并且大多数情况下都可以正常工作。

现在我经常遇到的一个问题是:

wsdl 中的参数定义了它们的类型(string、bool、int),但它们没有设置 nillable 属性。现在通常 int 或 bool 在响应中作为空元素返回,这会引发转换错误:

[FormatException: Input string was not in a correct format.]
   System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) +9594283
   System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) +119
   System.Xml.XmlConvert.ToInt32(String s) +43
   Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReadernutritionService.Read6_NullableOfInt32(Boolean checkType) +125

我现在要解决的问题是将所有参数类型更改为字符串,这样它们就不会在空元素上抛出错误。我根本不喜欢这个解决方案,所以我想知道是否可以以某种方式覆盖它,以便当元素为空时,我可以简单地为 int 填写 0,为 bool 填写 false。

有什么建议吗?

【问题讨论】:

  • 我很确定 WSDL 将是无效的 - 它确实允许可空(可空)类型,如果它没有指定,那么 WSDL 和服务不匹配。您可以修改 WSDL,或联系 Web 服务供应商
  • 这就是整个问题,我无法访问 wsdl。他们不打算为我更改 wsdl,我已经很好地问过了。

标签: .net web-services soap wsdl


【解决方案1】:

最简单的解决方案是制作 WSDL 的本地副本,进行所需的更改,然后调用它。您可以尝试花哨并编写动态执行此操作的脚本,但您可能会自找麻烦。

【讨论】:

  • 这可能是一个替代解决方案,但我引用了 10 个不同的 wsdl 文件,每个文件都有大量元素。我更喜欢一个解决方案,我可以在反序列化中操纵每个元素的转换。
猜你喜欢
  • 1970-01-01
  • 2013-05-30
  • 2012-09-18
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
  • 2011-08-03
相关资源
最近更新 更多