【问题标题】:How to reference a WSDL file using Visual Studio Code?如何使用 Visual Studio Code 引用 WSDL 文件?
【发布时间】:2017-01-05 23:55:35
【问题描述】:

重要的免责声明。此问题与generating a proxy to WSDL 无关。这不是关于creating a reference in VS Code,也不是。

我正在使用 Visual Studio Code(最新更新,11 月 16 日 v1.8),我需要创建对使用 WSDL 和 XSD 文件描述的外部 Web 服务的调用。我想使用上述编辑器来做到这一点,最好不必编写所有代理并封装自己。

这有可能还是我运气不好?

如果在 VS Code 中不可行,最简单的替代方案是什么?我们是在谈论使用 VS15 生成类和调用并复制文件,还是有我不熟悉的巧妙解决方法?

【问题讨论】:

  • 希望我的解决方案适合您。不幸的是,我还没有找到另一种添加此引用类型的方法。如果您想代理该服务,您可以创建包装器并将 Visual Studio 生成的代码复制/粘贴为标准 Web 服务。
  • 好吧,如果没有其他人提供更好的东西,我会接受你的回答。让我们希望有人知道更好的把戏。
  • 我也希望如此。我能想到的最好的方法是让 Visual Studio 完成繁重的工作,然后将结果复制/粘贴到 VSCode 项目中。它会自动为所有方法和类型生成代码。我对此也有点好奇——VSCode 是否允许您右键单击更新参考(用于更改 WSDL)我将在顶部添加更多信息——也许这可能会有所帮助
  • 擦掉额头上的汗水 唷...我已经添加了开始使用与 Visual Studio 相同的方法手动写出所需的内容,以及如果你想作弊,让 Visual Studio(社区)为你做。 - 涵盖了我认为的所有基础。 [ 手动,使用 Visual Studio 方法手动,使用 Visual Studio 构建并复制它] -- 我的偏好是第 3 个选项,因为它是最懒惰的,尽管选项 #1 可能被证明是更简洁的代码。

标签: c# visual-studio web-services asp.net-core visual-studio-code


【解决方案1】:

手动创建(从头开始)

如果从头开始构建并且不关心 Visual Studio 是如何做到的,您可以从一些基础知识 from this solution here 以及同一页面上已接受的解决方案中引用的其他链接开始。

使用与 Visual Studio 相同的方法手动创建

作为参考,下面的 Visual Studio 添加引用方法生成的一些文件存储在子文件夹 Web References/Example 中(其中 Example 是用于访问引用的变量的名称)并包含以下内容:

.map 文件

<?xml version="1.0" encoding="utf-8"?>
<DiscoveryClientResultsFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Results>
    <DiscoveryClientResult referenceType="System.Web.Services.Discovery.ContractReference" url="http://example.com/api/index.php?wsdl" filename="index.wsdl" />
  </Results>
</DiscoveryClientResultsFile>

.wsdl 文件(与上面的“文件名”参数同名)

此文件是完整的原始 wsdl 源文件(格式良好的 xml)。

参考文件

该文件包含初始化所有方法和属性的代码,是扩展System.Web.Services.Protocols.SoapHttpClientProtocol的基类

分配给类的属性(对不起,我从旧的 VB.NET 项目中剥离:如下所示:

<System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.1586.0"),  _
 System.Diagnostics.DebuggerStepThroughAttribute(),  _
 System.ComponentModel.DesignerCategoryAttribute("code"),  _
 System.Web.Services.WebServiceBindingAttribute(Name:="ExampleAPIBinding", [Namespace]:="urn:ExampleAPI"),  _
 System.Xml.Serialization.SoapIncludeAttribute(GetType(MyCustomType1)),  _
 System.Xml.Serialization.SoapIncludeAttribute(GetType(MyCustomType2)),  _

 Partial Public Class ExampleAPI
    Inherits System.Web.Services.Protocols.SoapHttpClientProtocol

 End Class

.datasource(每种类型1个文件)

示例代码

<?xml version="1.0" encoding="utf-8"?>
<!--
    This file is automatically generated by Visual Studio .Net. It is
    used to store generic object data source configuration information.
    Renaming the file extension or editing the content of this file may
    cause the file to be unrecognizable by the program.
-->
<GenericObjectDataSource DisplayName="MyMethodName" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
   <TypeInfo>ExampleAPI.SOAP.ClientMerchant, Web References.SOAP.Reference.vb.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
</GenericObjectDataSource>

使用 Visual Studio 为您构建它,然后在 VSCode 中再次打开

在 Visual Studio 中,您可以执行以下操作(并将结果复制到您的 VSCode 项目中)

步骤 1

在项目资源管理器中右键单击您的项目,然后选择添加 > 服务引用..


第二步

点击此屏幕上的[高级]


第三步

单击此屏幕上的 [添加 Web 引用]


第四步

输入 WSDL 位置的完整 URL,然后按 Enter。


终于

如果成功(找到格式良好的 WSDL),[添加引用] 按钮将被启用。单击它,它将添加对您项目的引用。

【讨论】:

  • 呵呵,太棒了,伙计,但我怀疑你错过了免责声明。我没有 Project Explorer,因为我正在使用 Visual Studio Code(即 VS Code 而不是 VS 20xx)。这是来自 MS 的新的轻量级 IDE。签出this
  • @KonradViltersten - 我确实错过了那个标签,因为它也被标记为 Visual Studio。但是我很确定您可以简单地从中复制输出。我不知道是否有一种快速的方法(在任何一种情况下)都可以嵌入引用,因为 SOAP 已经很老了(虽然很多人仍在使用)我不相信在 VSCode 中实现了一种自然的方法。
  • 我担心你是对的。至于“相当陈旧”的部分——好吧,我们的银行系统似乎认为使用 NET 2.0 是可以的,而 NET 3.5 感觉升级太仓促,所以我需要使用这个恐龙技术。
  • @KonradViltersten - 我从一个旧的 VB.NET 项目中添加了一些示例代码,如果从头开始构建它,希望可以提供帮助(可能比 Visual Studio 生成的版本更干净,恕我直言比较臃肿)。
  • 仅供参考,我没有投反对票。事实上,我只是对你 +1。我鄙视投反对票。
【解决方案2】:

你也可以使用 donet-svcutil

https://docs.microsoft.com/en-us/dotnet/core/additional-tools/dotnet-svcutil-guide?tabs=dotnetsvcutil2x

例子

dotnet-svcutil https://svn.apache.org/repos/asf/airavata/sandbox/xbaya-web/test/Calculator.wsdl

【讨论】:

  • 这只会默认生成异步方法。如果您还想要同步方法,请添加 --sync 参数。即 dotnet-svcutil --sync webservice...
【解决方案3】:

根据 Julio 的评论,以下是 .NET Core 所需的所有步骤(OSX 说明):

  1. 安装 dotnet-svcutil:

    dotnet tool install --global dotnet-svcutil
    
  2. 将工具路径添加到您的 .bash_profile:

    nano ~/.bash_profile
    

    添加这一行:

    export PATH=$PATH:$HOME/.dotnet/tools
    

    重新加载您的个人资料:

    . ~/.bash_profile
    
  3. 导航到您的应用或库路径并运行命令。您需要位于希望服务引用存在的路径中。例如:

    cd MY-PROJECT-FOLDER/Library
    dotnet-svcutil PATH-TO-MY-WSDL/my-wsdl.xml
    
  4. 将创建的文件添加到您的.csproj,默认情况下将创造性地命名为?ServiceReference/Reference.cs。该行在您的文件中将如下所示:

    <Content Include="ServiceReference\Reference.cs" />
    

【讨论】:

  • 不是每个人都像我们一样幸运。我们可以选择单线解决方案。 跳过 WSDL 并使用提供程序来生成自动类。 +1 用于基于 OSX 的建议。
【解决方案4】:

作为一种直接的方法,这可能对其他人有所帮助。您可以获得使用 SDK 中包含的 svutil.exe 工具生成的必要代理客户端。 如果您为文件创建文件夹,请通过命令行导航到该文件夹​​并运行该工具将生成代理文件以及您在自己的配置中需要的配置元素。

注意:您可以设置许多选项,包括代理输出语言,默认为 c#。

如果您的目标是您尝试使用的 svc WS,例如:http://abc.dfe.com/myWebService.svc,则会显示如下内容:

要测试此服务,您需要创建一个客户端并使用它来调用该服务。您可以使用命令行中的 svcutil.exe 工具执行此操作,语法如下:

svcutil.exe http://abc.dfe.com/myWebService.svc?wsdl

这将生成一个配置文件和一个包含客户端类的代码文件。将这两个文件添加到您的客户端应用程序中,并使用生成的客户端类调用服务。

希望这对有相同查询的人有所帮助,如果不是 OP。

【讨论】:

    【解决方案5】:

    如果您按照将dotnet-svcutil 与 Visual Studio Code/.Net Core 结合使用的步骤操作,您可能会在生成的 Reference.cs 文件中出现编译错误,因为这些包是 .Net Framework 而非 Core 的一部分.幸运的是,微软已经在 NuGet 上提供了它们。具体来说,我必须添加 System.ServiceModel.Primitives 和 System.ServiceModel.Http。

    在项目目录的命令行中输入以下内容:

    dotnet add package System.ServiceModel.Primitives
    dotnet add package System.ServiceModel.Http
    

    有关更多信息,请参阅此答案:System.ServiceModel not found in .NET Core project

    这篇微软文章提供了关于dotnet-svcutil的更多信息:https://docs.microsoft.com/en-us/dotnet/core/additional-tools/dotnet-svcutil-guide?tabs=dotnetsvcutil2x

    【讨论】:

      猜你喜欢
      • 2015-10-31
      • 2017-01-15
      • 2018-03-28
      • 2020-08-23
      • 2021-03-18
      • 2018-08-28
      • 2020-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多