代码之家  ›  专栏  ›  技术社区  ›  Pete

在C中引用多个WebService时解决类型不确定性#

  •  4
  • Pete  · 技术社区  · 17 年前

    我目前正在开发一个基于C的webapp,它调用了一些webservices。我已将三个不同的wsdl从提供程序导入到我的WebApplication3项目中(引用->添加Web引用)。在类查看器中,它们显示为:

    webapplication3.com.provider.webservices1
    webapplication3.com.provider.webservices2
    WebApplication3.属性

    显然,第一个和第二个WSDL具有重复的函数(这是正确的名称吗?)
    如果我将以下内容添加到我的default.aspx.cs中:

    使用webapplication3.com.sabre.webservices1;
    使用webapplication3.com.sabre.webservices2;
    使用webapplication3.properties;


    然后尝试使用:

    messageHeader msgheader=new messageHeader();
    在我的WebApplication3命名空间中,我得到了错误

    “webapplication3.com.provider.webservices1和 webapplication3.com.provider.webservices2“

    我想这是因为它在两个WSDL中都声明了?我该如何修复这个以便使用它?

    谢谢,如果这个问题愚蠢的话,我很抱歉!

    3 回复  |  直到 17 年前
        1
  •  5
  •   Zahir J    17 年前

    尝试使用其完整命名空间引用messageheader。 如。

    WebApplication3.com.provider.webservices1.MessageHeader msgHeader = new 
    WebApplication3.com.provider.webservices1.MessageHeader()
    

    为了简洁,你可以尝试

    using MessageHeader = WebApplication3.com.provider.webservices1.MessageHeader
    

    你可以用哪个

    MessageHeader msgHeader = new MessageHeader() 
    

    其中messageheader来自WebServices1命名空间

        2
  •  0
  •   George    17 年前

    用命名空间完全限定类名。

    WebApplication3.com.sabre.webservices1.MessageHeader msgHeader = new WebApplication3.com.sabre.webservices1.MessageHeader();
    
        3
  •  0
  •   Peter Meyer    17 年前

    似乎您已经导入了同一个WSDL两次——或者至少两个WSDL使用的某些类型是相同的。可以消除两个相同命名类型之间的歧义,而不是同时导入两个Web引用命名空间或使用命名空间别名。

    你能发布实际的代码片段并指出你使用“添加Web引用”导入的URL吗?另外,您使用的是哪个版本的Visual Studio,以及您要针对的是哪个版本的.NET Framework?

    编辑——根据Peter在评论中提供的信息进行跟进

    我检查了您发布的两个URL,只想提供一点背景信息。实际上,您第一次看到错误的原因是两个WSDL导入都指定了相同类型的使用,即 消息头 . 检查每个WSDL文件的顶部:

    http://webservices.sabre.com/wsdl/sabreXML1.0.00/usg/SessionCreateRQ.wsdl

    <definitions targetNamespace="https://webservices.sabre.com/websvc">
      <types>
        <xsd:schema>
        <xsd:import namespace="http://www.opentravel.org/OTA/2002/11" schemaLocation="SessionCreateRQRS.xsd"/>
        <xsd:import namespace="http://www.ebxml.org/namespaces/messageHeader" schemaLocation="msg-header-2_0.xsd"/>
        ...
    

    http://webservices.sabre.com/wsdl/sabreXML1.0.00/tpf/OTA_AirAvailLLS1.1.1RQ.wsdl

    <definitions targetNamespace="https://webservices.sabre.com/websvc">
      <types>
      <xsd:schema>
        <xsd:import namespace="http://webservices.sabre.com/sabreXML/2003/07" schemaLocation="OTA_AirAvailLLS1.1.1RQRS.xsd"/>
        <xsd:import namespace="http://www.ebxml.org/namespaces/messageHeader" schemaLocation="msg-header-2_0.xsd"/>
        ...
    

    每个WSDL文件的最后一行显示了类型名冲突的原因——每个WSDL文件都导入了相同的XSD文件,显然是因为这两个文件使用相同的类型。当您创建对每个WSDL文件的Web引用时,Visual Studio将检查WSDL并生成一个与导入的 消息头-2_0.xsd 图式。

    不幸的是,Visual Studio无法判断每个单独的WSDSL引用中的模式实际上是相同的类型,因此它会尽职地导入每个模式并为每个模式生成一个单独的类。尽管生成的每个类共享相同的名称,但每个类都在其自己的唯一命名空间中定义,该命名空间与每个WSDL文件相关联。

    所以,这就是为什么你为你的问题接受的解决方案有效——或者指定 一 这些类型起作用或使用别名来 一 其中的类型 一 特定命名空间的。

    另一种解决方案是修复两个Web引用以共享单个messageheader类型。这可以手动完成,但是,每次刷新Web服务引用时都必须重新进行手动编辑,所以我不推荐这样做。另外,使用合适的 消息头 为每个服务定义的类型,尽管它们是相同的。所以,我要创造两个 使用 别名如果假设要从同一源文件调用这两个服务:

    using MessageHeader1 = WebApplication3.com.sabre.webservices1.MessageHeader;
    using MessageHeader2 = WebApplication3.com.sabre.webservices2.MessageHeader;
    

    我会将messageheader1与您在命名空间下引用的任何服务一起使用 webapplication3.com.sabre.webservices1 同样,messageheader2与另一个相同。

    祝你好运!