如何在Visual Studio Code中引用WSDL文件?

13

重要免责声明。 这个问题不涉及生成WSDL代理。也不是关于在VS Code中创建引用的问题。

我正在使用Visual Studio Code(最新更新,v1.8 November 16)并需要创建一个调用外部Web服务的功能,该服务使用WSDL和XSD文件进行描述。我想要使用前述编辑器来完成此操作,并且最好不必自己编写所有代理和封装代码。

这是否可行,或者我对此束手无策?

如果在VS Code中无法做到,最简单的替代方案是什么?我们是在谈论使用VS15生成类和调用,然后复制文件,还是有一种我不熟悉的巧妙方法?


希望我的解决方案能够对您有所帮助。不幸的是,我没有找到另一种添加此引用类型的方法。如果您想代理服务,可以创建包装器并将Visual Studio生成的代码复制/粘贴为标准Web服务。 - Kraang Prime
如果没有其他更好的回答,我将接受你的答案。希望有人知道更好的技巧。 - Konrad Viltersten
我也希望如此。我能想到的最好方法是让Visual Studio完成繁重的工作,然后将结果复制/粘贴到VSCode项目中。它会自动生成所有方法和类型的代码。我也有点好奇这个问题——是否可以在VSCode中右键单击更新引用(针对WSDL的更改)我将在顶部添加一些更多信息——也许这可以帮助。 - Kraang Prime
擦汗 咻……我已经添加了必要的内容,以便手动编写时使用与 Visual Studio 相同的方法开始,以及如果您想作弊,只需让 Visual Studio(社区版)为您完成。——我认为已经覆盖了所有方面。[手动、手动使用 Visual Studio 方法、使用 Visual Studio 构建并复制输出] —— 我更喜欢第三种选项,因为它是最懒的,尽管第一种选项可能会产生更清晰的代码。 - Kraang Prime
5个回答

10

1
默认情况下,这将仅生成异步方法。如果您还想要同步方法,请添加--sync参数。例如:dotnet-svcutil --sync https://webservice... - Michael

8

回应Julio的评论,以下是使用.NET Core所需的所有步骤(适用于OSX):

  1. Install dotnet-svcutil:

    dotnet tool install --global dotnet-svcutil
    
  2. Add the tools path to your .bash_profile:

    nano ~/.bash_profile
    

    add this line:

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

    reload your profile:

    . ~/.bash_profile
    
  3. Navigate to your app or library path and run the command. You need to be in the path where you want your service reference to live. For example:

    cd MY-PROJECT-FOLDER/Library
    dotnet-svcutil PATH-TO-MY-WSDL/my-wsdl.xml
    
  4. Add the created file to your .csproj which by default will be creatively named ServiceReference/Reference.cs. The line will look like this in your file:

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

1
并不是每个人都像我们一样幸运。我们有一个一行代码的解决方案。跳过WSDL,使用提供者进行自动类生成。 对于基于OSX的建议加1。 - Konrad Viltersten

7

手动创建(从头开始)

如果您想从头开始构建并且不关心Visual Studio的构建方式,您可以从这个解决方案链接和同一页上被接受的解决方案中引用的其他链接入手。

使用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文件(与上面的“filename”参数同名)

这个文件是完整的原始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

.数据源(每种类型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

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

Add > Service Reference


步骤 2

在此屏幕上点击 [高级]

Add Service Reference


步骤三

在此屏幕上点击 [添加 Web 引用]

Service Reference Settings


步骤4

输入完整的WSDL位置URL并按Enter键。

Add Web Reference


最后

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


哈哈,太棒了,伙计,但我怀疑你错过了免责声明。我没有项目资源管理器,因为我正在使用Visual Studio Code(即VS Code而不是VS 20xx)。这是微软推出的一款新型轻量级IDE。看看这个 - Konrad Viltersten
@KonradViltersten - 我错过了那个标签,因为它也被标记为Visual Studio。但是我相当确定你可以简单地复制输出。我不知道是否有一种快速的方法(在任何情况下)来嵌入SOAP引用,因为SOAP已经相当老了(虽然仍有许多人在使用),我不认为VSCode中实现了自然的方式。 - Kraang Prime
我担心你是对的。至于所说的“相当陈旧”的部分——我们的银行系统似乎认为使用.NET 2.0没问题,而升级到.NET 3.5则过于匆忙,因此我需要使用这个过时的技术。 - Konrad Viltersten
@KonradViltersten - 我添加了一些来自旧的 VB.NET 项目的示例代码,如果你从头开始构建它,这些代码有望帮到你(可能可以比 Visual Studio 生成的版本更加简洁,我认为后者相当臃肿)。 - Kraang Prime
FYI 我没有给你投反对票。事实上,我刚给你点了一个加 1。我鄙视反对票。 - Konrad Viltersten
@KonradViltersten 没问题。我也不会随便点踩,除非真的很糟糕,即使如此,我也会评论或投票关闭。 :) 尝试从这个项目中收集数据,以帮助您如果需要从头开始构建参考资料。 - Kraang Prime

3
这可能有助于其他人采取直接方法。您可以使用SDK中的svutil.exe工具获取必要的代理客户端。如果创建一个文件夹用于存储这些文件,通过命令行导航到该文件夹并运行该工具,将生成代理文件以及您在自己的配置中需要的配置元素。
注意:您可以设置许多选项,包括代理输出语言,默认为c#。
如果您正在针对某个svc WS进行目标,例如:http://abc.dfe.com/myWebService.svc,则会显示如下内容:
要测试此服务,您需要创建一个客户端并使用它调用服务。您可以使用以下语法从命令行使用svcutil.exe工具来执行此操作:
svcutil.exe http://abc.dfe.com/myWebService.svc?wsdl 这将生成一个配置文件和一个包含客户端类的代码文件。将这两个文件添加到您的客户端应用程序中,并使用生成的客户端类调用服务。
希望这可以帮助有相同问题的人,如果不能帮助原帖发表者。

3
如果您按照使用Visual Studio Code/.Net Core的dotnet-svcutil的步骤,可能会因为一些属于.Net Framework而不是Core的包在生成的Reference.cs文件上出现编译错误。幸运的是,Microsoft已经在NuGet上提供了这些包。具体来说,我需要添加System.ServiceModel.Primitives和System.ServiceModel.Http。
请在项目目录下的命令行中输入以下内容:
dotnet add package System.ServiceModel.Primitives
dotnet add package System.ServiceModel.Http

请参考以下答案获取更多信息:.NET Core项目中找不到System.ServiceModel
此外,这篇微软文章提供了关于dotnet-svcutil的更多信息:https://learn.microsoft.com/en-us/dotnet/core/additional-tools/dotnet-svcutil-guide?tabs=dotnetsvcutil2x

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