wsdl.exe
可以生成与Visual Studio在添加Web引用时完全相同的文件吗?
哪些Windows CMD命令会模仿Visual Studio在添加Web引用时所执行的操作?
我有一个使用Web引用的VS2015项目:https://webservices.netsuite.com/wsdl/v2016_2_0/netsuite.wsdl(NetSuite - bleh)。
我可以在Visual Studio中添加Web服务引用(项目 - >添加服务引用 - >高级 - >>添加Web引用 - >输入URL - >添加引用)它将生成一大堆def __init__ (self, **kwargs) :
self._arr = (20,20,21,22,24,25,27,30,34,35,36,38,40,44,45,46,46,47,48,50,51,52,54,55,56,58,60,62,65,68,70,75,80,85,90,95,100,120,127)
self._desiredNumber = kwargs.get('desiredNumber', None)
def doesFit(self, *set):
# check values of A, B, C and D agains harcodded limits,
# if conditions met return true, else return false
return true
def solver(self, float desiredError = 0.00001):
cdef float computedNumber, computedError
computedNumber = 0
computedError = 0
cdef int arrSize, a, b, c, d
a = 0
b = 0
c = 0
d = 0
arrSize = len (self._arr)
cdef vector[float] arr = self._arr
result = []
for a from 0 <= a < arrSize:
for b from 0 <= b < arrSize:
for c from 0 <= c < arrSize:
for d from 0 <= d < arrSize:
computedNumber=arr[a]/arr[b]*arr[c]/arr[d]
computedError = fabs (self._desiredNumber - computedNumber)
if computedError<=desiredError and (a!=b and a!=c and a!=d and b!=c and b!=d and c!=d):
if self.doesFit(arr[a], arr[b], arr[c], arr[d]):
result.append(dict (A=arr[a], B=arr[b], C=arr[c], D=arr[d], desiredError=computedError, computedNumber=computedNumber))
# remove results with duplicated values of A, B, C and D.
# A/B*C/D is the same as C/D*A/B, etc
keyfunc = lambda d: (d['A'], d['B'], d['C'], d['D'])
giter = groupby(sorted(result, key=keyfunc), keyfunc)
result = [next(g[1]) for g in giter]
# sort results by desiredError
result = sorted(result, key=itemgetter('desiredError'))
# returns just the 12 best results
if len(result) > 12:
result = result[0:12]
return result
和.xsd
个文件:
一切都是可用和快乐的。耶。
但是,当我使用.datasource
时,它只生成一个文件: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 /?
不适合这份工作吗?
我正在努力让CI构建适用于我的项目(我们自我托管GitLab实例,所以我使用gitlab-ci)。该项目在我的开发计算机上构建得很好,因为这些wsdl.exe
和.xsd
文件都存在。
但是,它们并不存在于构建机器上。我发现我可以使用this answer使用MSBuild目标/任务更新WSDL数据。所以我将它添加到我的.datasource
文件中,它成功地将数据从NetSuite下载 - 仅发送到单个.cs文件而不是集合。因此,构建失败。
我可以简单地将所有网络参考文件签入git,但除非我绝对必须这样做,否则我不愿意这样做。
@RasmusW下面提到了较新的.csproj
实用程序。这部分就是其中的一部分 - 它会生成单独的scvutil.exe
个文件(.xsd
个文件might not be needed)。
但是,生成的.datasource
文件未正确命名。他们使用.xsd
值而不是namespace
值。
例如,在NetSuite提供的.wsdl文件中,我们有:
schemaLocation
生成的文件为<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
。
此外,还有VS2015生成的其他文件:
NetSuiteService.cs
accountingTypes.xsd
来获取。它返回与VS2015创建的完全相同的文件。Reference.cs
Reference.map
wsdl.exe /out:"Web References\com.netsuite.webservices\\" https://webservices.netsuite.com/wsdl/v2015_2_0/netsuite.wsdl
个项目,用于将网址映射到文件名。我假设这是Visual Studio获取.xsd文件名称的方式,但我不确定。DiscoveryClientResult
答案 0 :(得分:0)
注意:以下所有内容都特定于我使用的{({3}})WSDL文件,因此它可能对您无效。但是,嘿,值得一试!
经过一些实验,这就是我提出来回答这个问题的原因:
VS创建Web References文件夹和命名空间文件夹。这需要完成,因为以下步骤不一定为您创建文件夹。请注意,您需要相应地更改文件夹名称。在此示例中,com.netsuite.webservices
是放置所有内容的命名空间。
SET OUR_DIR="%PROJECT_NAME%\Web References\com.netsuite.webservices"
mkdir "%OUR_DIR%"
使用NetSuite工具创建主.cs
文件。
wsdl.exe /out:"%OUR_DIR%\NetSuiteService.cs" %WSDL_URL%
请注意,我们正在使用
wsdl.exe
,即使它被弃用而不是WSDL.exe
。这是因为在从wsdl文件生成源代码时,这两个工具输出不同的文件。我不知道为什么会这样 - 它可能特定于我使用的wsdl文件,或者可能是出于其他原因。
使用svcutil.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构建期间下载/复制到build文件夹。例如,我将它放在构建机器上的C:\Utilities
文件夹中,因此我可以将其拉入
copy "C:\Utilities\NetSuite_DO_NOT_DELETE__Reference.cs" "%OUR_DIR%\Reference.cs"