wsdl.exe 能否生成与 Visual Studio 添加 Web 引用时相同的文件?

Posted

技术标签:

【中文标题】wsdl.exe 能否生成与 Visual Studio 添加 Web 引用时相同的文件?【英文标题】:Can wsdl.exe generate the same files that Visual Studio does when adding a web reference? 【发布时间】:2017-08-04 01:12:56 【问题描述】:

简短、简短的版本

wsdl.exe 能否生成与 Visual Studio 添加 Web 引用时完全相同的文件?

或者:

在添加 Web 引用时,哪些 Windows CMD 命令可以模仿 Visual Studio 的操作?

更多细节

我有一个使用 Web 参考的 VS2015 项目:https://webservices.netsuite.com/wsdl/v2016_2_0/netsuite.wsdl (NetSuite - bleh)。

我可以在 Visual Studio 中添加 Web 服务引用(项目 -> 添加服务引用 -> 高级 -> 添加 Web 引用 -> 输入 URL -> 添加引用),它将生成一大堆.xsd 和 @ 987654331@文件:

一切都是可用的和快乐的。耶。


但是,当我使用WSDL.exe 时,它只生成一个文件:NetSuiteService.cs

C:\CSharpPlayground\CSharpPlayground>mkdir "Web References\com.netsuite.webservices"

C:\CSharpPlayground\CSharpPlayground>wsdl.exe /:"Web References\com.netsuite.webservices" "https://webservices.netsuite.com/wsdl/v2016_2_0/netsuite.wsdl"
Microsoft (R) Web Services Description Language Utility
[Microsoft (R) .NET Framework, Version 4.6.1055.0]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file 'C:\CSharpPlayground\CSharpPlayground\NetSuiteService.cs'.

我已经倾注了wdsl.exe /? 并没有找到任何看起来对我有帮助的东西。

wsdl.exe 不是适合这项工作的工具吗?

背景

我正在尝试让 CI 构建为我的项目工作(我们自己托管了一个 GitLab 实例,所以我使用的是 gitlab-ci)。该项目在我的开发计算机上构建得很好,因为这些 .xsd.datasource 文件都存在。

但是,它们在构建机器上不存在。我发现感谢this answer,我可以使用 MSBuild 目标/任务更新 WSDL 数据。所以我将它添加到我的.csproj 文件中,它成功地从 NetSuite 下载数据 - 仅下载到单个 .cs 文件而不是集合。因此,构建失败。

我可以简单地将所有网络参考文件签入到 git,但我宁愿不这样做,除非我绝对必须这样做。

更新 1 (2017-03-13 15:56 PDT)

@RasmusW 下面提到了较新的scvutil.exe 实用程序。这就是其中的一部分 - 它生成单独的 .xsd 文件(.datasource 文件 might not be needed)。

但是,生成的.xsd 文件命名不正确。他们使用的是namespace 值而不是schemaLocation 值。

例如,在NetSuite提供的.wsdl文件中我们有:

<xsd:import namespace="urn:types.accounting_2015_2.lists.webservices.netsuite.com" schemaLocation="https://webservices.netsuite.com/xsd/lists/v2015_2_0/accountingTypes.xsd"/>

生成的文件是types.accounting_2015_2.lists.webservices.netsuite.com.xsd,而不是accountingTypes.xsd

另外还有VS2015生成的其他文件:

NetSuiteService.cs

我可以通过使用wsdl.exe /out:"Web References\com.netsuite.webservices\\" https://webservices.netsuite.com/wsdl/v2015_2_0/netsuite.wsdl 获得。它返回与 VS2015 创建的完全相同的文件。

Reference.cs

不知道这到底是什么或它是如何生成的。不过,它似乎与 NetSuiteService.cs 中的内容非常相似。

Reference.map

这是一个 xml 文件,其中包含一组将 url 映射到文件名的 DiscoveryClientResult 项目。我认为这就是 Visual Studio 获取 .xsd 文件名称的方式,但我不确定。 看起来像:&lt;DiscoveryClientResult referenceType="System.Web.Services.Discovery.SchemaReference" url="https://webservices.netsuite.com/xsd/lists/v2015_2_0/accountingTypes.xsd" filename="accountingTypes.xsd" /&gt;

【问题讨论】:

您想使用 wsdl.exe 而不是 svcutil.exe 的任何特殊原因? wsdl.exe和svcutil.exe的区别可以看这个问题:***.com/questions/18311816/… @RasmusW 因为我不知道svcutil.exe :-) 对该工具的非常粗略的检查会产生同样的结果——生成一个文件。我目前正在查看选项,看看是否有我可以设置的标志。 【参考方案1】:

注意:以下所有内容都特定于我正在使用的 WSDL 文件 (NetSuite),因此它可能不适合您。但是,嘿,值得一试!

经过一些实验,这是我想出的回答问题的方法:

在添加 Web 引用时,哪些 Windows CMD 命令可以模仿 Visual Studio 的操作?

    VS 创建 Web References 文件夹和命名空间文件夹。这需要完成,因为以下步骤不一定会为您创建文件夹。请注意,您需要相应地更改文件夹名称。在这个例子中,com.netsuite.webservices 是所有东西都放入的命名空间。

    SET OUR_DIR="%PROJECT_NAME%\Web References\com.netsuite.webservices"
    mkdir "%OUR_DIR%"
    

    使用WSDL.exe 工具创建.cs 主文件。

    wsdl.exe /out:"%OUR_DIR%\NetSuiteService.cs" %WSDL_URL%
    

    请注意,我们使用的是wsdl.exe,尽管它已被svcutil.exe 弃用。这是因为这两个工具在从 wsdl 文件生成源代码时会输出不同的文件。我不知道这是为什么 - 它可能是我正在使用的 wsdl 文件所特有的,也可能是出于其他原因。

    使用disco.exe 工具创建.xsd 文件。呵呵有趣的名字。

    disco.exe /out:"%OUR_DIR%" %WSDL_URL%
    

    这会生成上面问题的屏幕截图中显示的单个 .xsd 文件。它还创建映射名称的映射文件以使事情变得漂亮(请参阅有问题的更新 1)。但是,我一直没搞清楚如何更改mapfile的输出名称(默认为results.discomap),所以我只是手动操作:

    move "%OUR_DIR%\results.discomap" "%OUR_DIR%\Reference.map"
    

以上步骤几乎为您提供了一切 - 文件与 Visual Studio (2015) 创建的完全匹配,但仍然缺少 Reference.cs。此文件似乎与 WSDL 生成的代码 NetSuiteService.cs 非常相似,但将所有内容都放入了步骤 1 中的命名空间(文件夹 com.netsuite.webservices)。

遗憾的是,我无法弄清楚如何生成这个Reference.cs 文件。

我唯一的解决方案是在我的开发机器上生成此文件,将其复制到我可以轻松访问的位置,然后在 CI 构建期间将其下载/复制到构建文件夹。比如我把它放在构建机器上的C:\Utilities文件夹中,这样我就可以用

copy "C:\Utilities\NetSuite_DO_NOT_DELETE__Reference.cs" "%OUR_DIR%\Reference.cs"

【讨论】:

以上是关于wsdl.exe 能否生成与 Visual Studio 添加 Web 引用时相同的文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 wsdl 生成 Web 服务

svcutil.exe 未为 minOccurs=0 生成指定字段

WSDL.exe 工具的 /serverInterface 和 /server 选项有啥用

在自定义构建中自动化 WSDL.exe

WSDL自动生成WebService代理类的方法

wsdl.exe 错误:无法从命名空间“...”导入绑定“...”