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 文件名称的方式,但我不确定。
看起来像:<DiscoveryClientResult referenceType="System.Web.Services.Discovery.SchemaReference" url="https://webservices.netsuite.com/xsd/lists/v2015_2_0/accountingTypes.xsd" filename="accountingTypes.xsd" />
【问题讨论】:
您想使用 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 引用时相同的文件?的主要内容,如果未能解决你的问题,请参考以下文章
svcutil.exe 未为 minOccurs=0 生成指定字段