【问题标题】:How to generate service reference with only physical wsdl file如何仅使用物理 wsdl 文件生成服务引用
【发布时间】:2012-09-24 11:40:41
【问题描述】:

多年来,我一直在创建和使用 Web 服务,并且始终能够使用 Visual Studio 从客户端创建服务引用。我需要使用第三方服务,但他们拒绝打开安全性,因此我可以查看 wsdl 并提供服务参考。这是一项面向公众的服务,因此我认为不需要这种级别的安全性,但它就是这样。

我知道这是一个 n00b 问题,我很惭愧地问这个问题,但是当我可用的只是客户端 wsdl 的物理副本时,我该如何在客户端中创建等效的服务参考信息给我发电子邮件? web.config 更改,SOAP 数据上的对象层等。就像使用自动化服务引用一样,我只想打开到服务的连接并开始将其与定义的对象一起使用。

据我所知,第三方服务不是 WCF,而是 SOAP。我正在使用 VS 2010 顺便说一句。 提前致谢, 肯

【问题讨论】:

标签: .net web-services service-reference


【解决方案1】:

这可能是最简单的方法

  • 右键单击项目并选择“添加服务引用...”
  • 在地址:框中,输入下载/修改后的wsdl的物理路径(C:\test\project....)。
  • 点击开始

【讨论】:

  • 如果您使用“复制为路径”,请去掉引号。
  • 保存 wsdl 以传递给其他人时,从 chrome 中的 web 服务“查看源代码”给了我一个工作 wsdl,而 IE11 没有。 YMMV。
【解决方案2】:

有两种方法可以解决这个问题。您可以使用 IDE 生成 WSDL,也可以通过命令行生成。

1.通过 IDE 创建它:

在解决方案资源管理器窗格中,右键单击要将服务添加到的项目:

然后,您可以输入服务 WSDL 的路径并点击 go:

2.通过命令行创建它:

打开 VS 2010 命令提示符(程序 -> Visual Studio 2010 -> Visual Studio 工具)
然后执行:

WSDL /verbose C:\path\to\wsdl

WSDL.exe 然后会输出一个 .cs 文件供您使用。

如果您有随文件收到的其他依赖项,例如 xsd,请将它们添加到参数列表中:

WSDL /verbose C:\path\to\wsdl C:\path\to\some\xsd C:\path\to\some\xsd

如果您需要VB输出,除了/verbose之外,请使用/language:VB

【讨论】:

  • 我得到'无法从命名空间'blahURL'导入绑定'blah'并且无法导入操作'SomeRequest',缺少元素'xxx'。这是否意味着他们需要给我更多的支持文件,或者他们的安全性被锁得太紧以至于我无能为力?
  • 听起来您确实缺少依赖项。打开 WSDL 并查看顶部。如果您看到行中包含 import 后跟指向 xsd 路径的 schemaLocation,那么您也需要这些 xsd 文件。
  • 感谢您的回复。我与客户有一封出色的电子邮件,看看我是否可以获得必要的 xsd 导入。令人沮丧的是,如果做得对,我只需将一个 URL 弹出到 ServiceReference 对话框中,按下一个按钮,然后中提琴!我距离调用服务方法大约 3 行代码。整个过程大约需要5分钟。但我已经与这个客户合作了数周,却一无所获,因为他们的安全人员不会通过网络开放对任何服务定义的访问。
  • 这很粗糙。我自己目前正在等待一个项目的 vpn 连接。幸运的是,他们提前给了我 wsdl 和随附的 xsd 文档。所以你确实在 wsdl 中找到了这些导入?
  • 是的。结果他们给了我 4 项服务,其中 2 项是 wsdl,另外 2 项是 xsd,因此没有任何服务的完整文件集。但我终于得到了 xsd 并且能够为其中 2 个服务生成 .cs 文件,我假设其他 2 个将跟随。谢谢。
【解决方案3】:

前辈们展示了如何从本地文件导入,但是您的 WSDL 引用一个或多个 XSD 并且您会收到错误的可能性很小:

您必须下载所有引用的 XSD 文件,并将它们放在与引用的 WSDL 相同的目录中。 然后您将不得不手动编辑 WSDL,并将 schemaLocation 更改为本地下载的文件。

之前

  <wsdl:types>
    <xsd:schema targetNamespace="http://tempuri.org/Imports">
      <xsd:import schemaLocation="http://gate.somesite.local:8084/Shop/SomeService.svc?xsd=xsd0" namespace="http://tempuri.org/" />
      <xsd:import schemaLocation="http://gate.somesite.local:8084/Shop/SomeService.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/" />
      <xsd:import schemaLocation="http://gate.somesite.local:8084/Shop/SomeService.svc?xsd=xsd2" namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />
    </xsd:schema>
  </wsdl:types>

之后

  <wsdl:types>
    <xsd:schema targetNamespace="http://tempuri.org/Imports">
      <xsd:import schemaLocation="tempuri.org.xsd" namespace="http://tempuri.org/" />
      <xsd:import schemaLocation="schemas.microsoft.com.2003.10.Serialization.xsd" namespace="http://schemas.microsoft.com/2003/10/Serialization/" />
      <xsd:import schemaLocation="schemas.microsoft.com.2003.10.Serialization.Arrays.xsd" namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />
    </xsd:schema>
  </wsdl:types>

请注意,那些下载的 XSD 文件也有可能引用网址。

像这样:

之前

<xs:schema xmlns:tns="http://schemas.datacontract.org/2004/07/DaxServiceLibrary.Messages" elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/DaxServiceLibrary.Messages" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import schemaLocation="http://gate.somesite.local:8084/Shop/DaxService.svc?xsd=xsd2" namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />

之后

<xs:schema xmlns:tns="http://schemas.datacontract.org/2004/07/DaxServiceLibrary.Messages" elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/DaxServiceLibrary.Messages" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:import schemaLocation="schemas.microsoft.com.2003.10.Serialization.Arrays.xsd" namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 2011-04-16
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 2010-11-26
    相关资源
    最近更新 更多