【发布时间】:2014-02-20 02:36:58
【问题描述】:
我已经开始使用一些在 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 的类型不同。消息头。我已经尝试过使用鸭子打字,但据我所知,它的嵌套性质会阻止这种方法。
查看 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 服务的任何内容。那完全是另一家公司,不会有兴趣根据我的突发奇想重新设计他们广泛使用的系统。
【问题讨论】:
-
您使用的是 Web 引用还是服务引用?如果是后者,那么您可以尝试点击高级菜单上的“分享类型”。
-
我是通过添加服务参考添加的,所以是后者。您是指“从引用的程序集中重用类型”选项吗?我对这两个都进行了检查。你用这两个例子试过了吗?我不确定这是否对这个问题没有任何作用,或者是否由于他们编写 xsd 的方式而无法正常工作。我确实发现了一些信息,WSCF.blue 可能是一个不错的选择,但还没有尝试过。
标签: c# visual-studio oxygene