【问题标题】:how to handle redundant classes used in web services如何处理 Web 服务中使用的冗余类
【发布时间】: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


【解决方案1】:

我已经找到了一个潜在的解决方案,并且它在我能说的所有方面都有效。但我愿意接受批评或“更好的方法”(包括从 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

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

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

我通过this postthis post 找到了这个解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多