我已经开始使用一些在 Visual Studio 2012 中添加为 Web 服务时具有惊人数量冗余的 Web 服务。这里有两个 WSDL 可以证明这一点:
http://webservices.sabre.com/wsdl/sabreXML1.0.00/usg/SessionCreateRQ.wsdl
http://webservices.sabre.com/wsdl/sabreXML1.0.00/usg/SessionCloseRQ.wsdl
这些是分别创建新会话和关闭它的服务。每个服务都有自己的MessageHeader
类,该类又具有一个来自MessageData
在每个生成的代理中重新定义的类的成员。还有其他类似的,但我不会全部命名。
当我想创建一个帮助函数来设置我的请求并填写信封中的所有常见内容(例如时间戳、身份验证等)时,这会变得很困难,因为 Service1.MessageHeader 与 Service2.MessageHeader 的类型不同。我已经尝试过鸭子打字,但据我所知,这种嵌套性质会阻止这种方法。
查看 WSDL,这些类都被定义为来自相同的名称空间。换句话说,在两个 WSDL 中,MessageHeader
都定义为:
<xsd:import namespace="http://www.ebxml.org/namespaces/messageHeader" schemaLocation="msg-header-2_0.xsd"/>
...
<part name="header" element="eb:MessageHeader"/>
有什么方法可以让 VS 理解这些在两个类中是相同的,并以某种方式将它们分开为两者的共同点?还是“Web 服务是一座孤岛”?我真的不想为我需要的每种类型的 Web 服务创建单独的代码,因为不仅仅是这两个。但是他们每个人都使用这些相同的类。
我考虑过手动破解代理类。但除了我担心这会使 VS 滑倒一些齿轮,因为我搞砸了它在幕后所做的事情,它从未期望我修补过,如果 WSDL 发生变化,我将失去整个自动生成需要重新同步。
我已经在 C# 和 Oxygene 中尝试过这个并且遇到了同样的问题。我想在VS下的其他语言中它会是一样的。它似乎与它如何理解 WSDL 有关。
在任何人问之前,我无法更改有关实际 Web 服务的任何内容。那完全是另一家公司,不会有兴趣根据我的突发奇想重新设计他们广泛使用的系统。