我正在使用另一家公司的网络服务,他们有多个版本正在运行,每个较新的版本仅添加了新字段/对象,但更改了一些元素名称。
我希望能够使用相同代码使用任何版本。
具体来说,在一个版本中,搜索方法返回:
<searchReturn><SummaryData_Version1Impl /><SummaryData_Version1Impl /></searchReturn>
不同版本:<searchReturn><SummaryData_Version2Impl /><SummaryData_Version2Impl /></searchReturn>
因此,由于该元素的更改,现在由 wsdl.exe 生成的代理无法同时使用两者。
- 最好的解决方案是让另一家公司修复他们的服务,不要更改元素名称,但在这种情况下这种情况不太可能发生
- 我认为工作解决方案的最佳选择是手动发送和获取 SOAP 请求,修改元素名称,然后手动反序列化,到目前为止,这似乎是可行的。 ——但是需要做很多工作
- 我刚刚确认手动加载 xml(在使用 string.Replace 更改元素名称后)会将任何版本的服务反序列化为所需的对象
- 或者通过修改生成的代理来执行类似的操作:
- 如果我可以在生成的代理尝试反序列化 SOAP 响应之前拦截并修改它
- 如果我可以在运行时修改服务的 XmlTypeAttribute
- 我还考虑过拥有一系列接口(interface),因此每个类都将具有较旧的
class Data3 : IData3, IData2, IData1
的接口(interface)我想这至少可以让我向下转换。并将每个版本放入不同的命名空间中。 - 我刚刚研究了一些鸭子类型技术,它们可能可行,但似乎不太可靠。
- 还有其他方法可以从多个元素名称反序列化吗?
最佳答案
没有办法做到这一点。不同的版本是不同的。无法提前知道它们有多相似。
关于c# - 将多个 WSDL 版本反序列化为同一对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5410311/