2

我已经开始使用一些在 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 服务的任何内容。那完全是另一家公司,不会有兴趣根据我的突发奇想重新设计他们广泛使用的系统。

4

1 回答 1

2

我已经找到了一个潜在的解决方案,并且它以我能说的各种方式起作用。但我愿意接受批评或“更好的方法”(包括从 GUI 中做到这一点的更好方法)。

我发现使用以下命令会生成我想要的正确“单单元”类型的接口,并共享所有类型:

 wsdl.exe /sharetypes /language:CS "http://webservices.sabre.com/wsdl/sabreXML1.0.00/usg/SessionCreateRQ.wsdl" "http://webservices.sabre.com/wsdl/sabreXML1.0.00/usg/SessionCloseRQ.wsdl" /o:"SabreWebServices.cs" /n:SabreWebServices

这将创建一个 C#。对于氧气,我使用:

 wsdl.exe /sharetypes /language:OXYGENE "http://webservices.sabre.com/wsdl/sabreXML1.0.00/usg/SessionCreateRQ.wsdl" "http://webservices.sabre.com/wsdl/sabreXML1.0.00/usg/SessionCloseRQ.wsdl" /o:"SabreWebServices.pas" /n:SabreWebServices

"c:\Program Files\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 ToolsFWIW,我使用了我机器上目录中的 wsdl 。

我将生成的包装器文件添加到我的应用程序中,它运行良好,如果与通过添加服务引用创建的包装器有点不同的话。我实际上更喜欢这种创建的语法。它还具有仅创建一个文件而不是创建多个文件并且不与 app.config 混淆的好处。如果要更改端点,只需设置Url您实例化的任何服务的属性。

我通过这篇文章这篇文章中找到了这个解决方案。

于 2014-02-03T18:14:42.420 回答