c# - 将多个 WSDL 版本反序列化为同一对象

标签 c# wsdl webservice-client xml-deserialization

我正在使用另一家公司的网络服务,他们有多个版本正在运行,每个较新的版本仅添加了新字段/对象,但更改了一些元素名称。

我希望能够使用相同代码使用任何版本。

具体来说,在一个版本中,搜索方法返回: <searchReturn><SummaryData_Version1Impl /><SummaryData_Version1Impl /></searchReturn>

不同版本:<searchReturn><SummaryData_Version2Impl /><SummaryData_Version2Impl /></searchReturn>

因此,由于该元素的更改,现在由 wsdl.exe 生成的代理无法同时使用两者。

  1. 最好的解决方案是让另一家公司修复他们的服务,不要更改元素名称,但在这种情况下这种情况不太可能发生
  2. 我认为工作解决方案的最佳选择是手动发送和获取 SOAP 请求,修改元素名称,然后手动反序列化,到目前为止,这似乎是可行的。 ——但是需要做很多工作
    • 我刚刚确认手动加载 xml(在使用 string.Replace 更改元素名称后)会将任何版本的服务反序列化为所需的对象
  3. 或者通过修改生成的代理来执行类似的操作:
    • 如果我可以在生成的代理尝试反序列化 SOAP 响应之前拦截并修改它
    • 如果我可以在运行时修改服务的 XmlTypeAttribute
  4. 我还考虑过拥有一系列接口(interface),因此每个类都将具有较旧的 class Data3 : IData3, IData2, IData1 的接口(interface)我想这至少可以让我向下转换。并将每个版本放入不同的命名空间中。
  5. 我刚刚研究了一些鸭子类型技术,它们可能可行,但似乎不太可靠。
  6. 还有其他方法可以从多个元素名称反序列化吗?

最佳答案

没有办法做到这一点。不同的版本是不同的。无法提前知道它们有多相似。

关于c# - 将多个 WSDL 版本反序列化为同一对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5410311/

相关文章:

c# - 自动验证一些线程限制? (C#)

php - 如何使用项目列表定义 SOAP 响应的 WSDL 复杂类型

c# - 尝试添加 silverlight 服务时出现 "cannot import wsdl:binding"错误

java - 如何以编程方式动态创建 WSDL 并在没有生成代码或 Java stub 的情况下解析请求?

java - Webservice调用返回错误500

c# - SqlBulkCopy 到具有复合主键的表中

时间:2019-03-17 标签:c#AzureFunctions分离html和css

c# - 我能否简要了解 WPF 中窗口加载/初始化期间发生的情况?

java - 由于 java 中缺少证书(基于 XML SOAP)而导​​致使用 Web 服务时出错

Java Web服务错误-vendor.xml无法启动