如何仅使用物理 WSDL 文件生成服务引用

144

我多年来一直在创建和使用网络服务,并且一直能够使用Visual Studio从客户端创建服务引用。 我需要使用第三方服务,但他们拒绝打开安全性以便我可以查看wsdl并创建服务引用。 因为这是一个公共面向服务,所以我不认为需要那种安全级别,但事实就是这样。

我知道这是一个初学者的问题,我很惭愧地提出了这个问题,但如果我只有客户端电子邮件给我的wsdl物理副本,该怎么做才能在客户端中创建等效的服务引用信息呢?网页配置更改、SOAP数据上的对象层等等。 就像自动化服务引用一样,我只想打开与定义对象连接的服务并开始使用它。

据我所知,第三方服务不是WCF,而是SOAP。 我正在使用VS 2010。


1
可能是从WSDL文件在Visual Studio中创建Web服务代理的重复问题。 - John Fouhy
3个回答

205

这可能是最简单的方法

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

15
如果您使用"复制路径",请去掉引号。 - O. Jones
当保存WSDL以传递给其他人时,从Chrome中的Web服务的WSDL的“查看源”给了我一个可用的WSDL,而IE11没有。可能会有所不同。 - archangel76

88

有两种方法可以实现这个。您可以使用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'丢失”的错误提示。这是不是意味着他们需要给我更多的支持文件,还是说他们的安全性非常高,以至于我什么都做不了? - kfoster
看起来你缺少依赖项。打开 WSDL 文件并查看顶部。如果你看到有 import 行,后面跟着一个指向 xsd 路径的 schemaLocation,那么你也需要这些 xsd 文件。 - Lynn Crumbling
很艰难。我目前也在等待一个项目的 VPN 连接。幸运的是,他们提前给了我 wsdl 和相关的 xsd 文档。所以你在 wsdl 中找到那些导入了吗? - Lynn Crumbling
是的。结果是,对于4个服务,他们给了我2个wsdl文件和另外2个xsd文件,所以没有任何一个服务的完整文件集。但是我最终得到了xsd文件,并且能够为其中的2个服务生成.cs文件,其他2个服务应该会随后提供。谢谢。 - kfoster
没问题,我找到了答案并将其放在这里:https://dev59.com/Z2Ik5IYBdhLWcg3wdd_Y#39167382 - NoWar
显示剩余2条评论

4

前辈们都说如何从本地文件导入,但你的WSDL文件很可能会引用一个或多个XSD文件,并且你会收到错误信息:

WSDL引用错误

你需要下载所有被引用的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" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接