wsdl.exe是否可以生成与Visual Studio在添加Web引用时所执行的文件相同的文件?

时间:2017-03-13 21:09:54

标签: c# visual-studio web-services wsdl

简短版

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个文件:

Generated by Visual Studio

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

但是,当我使用.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,但除非我绝对必须这样做,否则我不愿意这样做。

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

@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

    • 不知道这究竟是什么或它是如何产生的。它似乎与NetSuiteService.cs中的内容非常相似。
  • Reference.map

    • 这是一个xml文件,其中包含一堆wsdl.exe /out:"Web References\com.netsuite.webservices\\" https://webservices.netsuite.com/wsdl/v2015_2_0/netsuite.wsdl个项目,用于将网址映射到文件名。我假设这是Visual Studio获取.xsd文件名称的方式,但我不确定。
    • 类似于:DiscoveryClientResult

1 个答案:

答案 0 :(得分:0)

  

注意:以下所有内容都特定于我使用的{({3}})WSDL文件,因此它可能对您无效。但是,嘿,值得一试!

经过一些实验,这就是我提出来回答这个问题的原因:

哪些Windows CMD命令会模仿Visual Studio在添加Web引用时所执行的操作?

  1. VS创建Web References文件夹和命名空间文件夹。这需要完成,因为以下步骤不一定为您创建文件夹。请注意,您需要相应地更改文件夹名称。在此示例中,com.netsuite.webservices是放置所有内容的命名空间。

    SET OUR_DIR="%PROJECT_NAME%\Web References\com.netsuite.webservices"
    mkdir "%OUR_DIR%"
    
  2. 使用NetSuite工具创建主.cs文件。

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

    请注意,我们正在使用wsdl.exe,即使它被弃用而不是WSDL.exe。这是因为在从wsdl文件生成源代码时,这两个工具输出不同的文件。我不知道为什么会这样 - 它可能特定于我使用的wsdl文件,或者可能是出于其他原因。

  3. 使用svcutil.exe工具创建.xsd个文件。呵呵好玩的名字。

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

    这将生成上述问题屏幕截图中显示的各个.xsd文件。它还会创建映射名称的映射文件以使其更加美观(请参阅相关的更新1)。但是,我还没有弄清楚如何更改mapfile的输出名称(默认为results.discomap),所以我只是手动执行:

    move "%OUR_DIR%\results.discomap" "%OUR_DIR%\Reference.map"
    
  4. 以上步骤为您提供几乎所有内容 - 这些文件与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"