34

在我创建的 WSDL 上运行 wsdl.exe 时,出现此错误:

错误:无法从命名空间“SomeNS”导入绑定“SomeBinding”。

  • 无法导入操作“someOperation”。
  • 这些成员可能无法派生。

我正在使用文档文字样式,据我所知,我正在遵守所有规则。

总而言之,我有一个有效的 WSDL,但该工具不喜欢它。

我正在寻找的是是否有人对 wsdl.exe 工具有很多经验并且知道一些我不知道的秘密问题。

4

6 回答 6

57

我遇到了同样的错误信息。挖了一会,发现除了wsdl文件外,还可以提供xsd文件。因此,除了 .wsdl 之外,在 wsdl 命令的末尾还包含/导入了 .xsd 文件,如下所示:

wsdl.exe myWebService.wsdl myXsd1.xsd myType1.xsd myXsd2.xsd ...

Wsdl 给出了一些警告,但它确实创建了一个好的服务接口。

于 2009-01-23T14:05:24.403 回答
8

有时您必须更改您的代码。消息部分名称不应该相同;)

<wsdl:message name="AnfrageRisikoAnfrageL">
    <wsdl:part name="parameters" element="his1_0:typeIn"/>
</wsdl:message>
<wsdl:message name="AnfrageRisikoAntwortL">
    <wsdl:part name="parameters" element="his1_0:typeOut"/>
</wsdl:message>

对此:

<wsdl:message name="AnfrageRisikoAnfrageL">
    <wsdl:part name="in" element="his1_0:typeIn"/>
</wsdl:message>
<wsdl:message name="AnfrageRisikoAntwortL">
    <wsdl:part name="out" element="his1_0:typeOut"/>
</wsdl:message>
于 2010-11-24T17:51:02.227 回答
5

在我的情况下,问题是不同的,这里有很好的描述:

每当部件的名称是“参数”时,.Net 假定使用 doc/lit/wrapped 并相应地生成代理。如果即使使用了“参数”一词,wsdl 也不是 doc/lit/wrapped(如上一个示例所示),.Net 可能会给我们一些错误。哪个错误?你猜对了:“这些成员可能不是派生出来的”。现在我们可以理解错误的含义:.Net 尝试省略根元素,因为它认为使用了 doc/lit/wrapped。然而,这个元素不能被删除,因为它不是虚拟的——它应该由用户从几个派生类型中主动选择。

修复如下,对我来说非常有效:

修复它的方法是在文本编辑器中打开 wsdl 并将部件名称从"parameters"更改为"parameters1"。现在 .Net 将知道生成一个 doc/lit/bare 代理。这意味着一个新的包装类将作为根参数出现在代理中。虽然这可能是一个更乏味的 api,但这不会对有线格式产生任何影响,并且代理是完全可互操作的。

(我强调)

于 2015-11-20T12:16:59.337 回答
4

@thehhv 解决方案是正确的。有一种解决方法不需要您xsd手动添加 s。

然后转到您的服务而不是?wsdl转到?singleWsdl(下面的屏幕截图)

在此处输入图像描述

然后将页面保存为.wsdl文件(它会提供.svc所以改变它)

然后打开Visual studio command prompt你可以在(Win 7)开始 -> 所有程序 -> Visual Studio 2013 -> Visual Studio 工具 -> VS2013 x64 Native Tools 命令提示符(可能是类似的)
然后运行以下命令Visual studio command prompt(在哪里而不是C:\WebPricingService.wsdl 是您保存 wsdl 的位置,除非碰巧我们认为非常相似并选择相同的文件名和位置,这令人担忧)

wsdl.exe C:\WebPricingService.wsdl

正如@thehhv 所说,它应该给您一些警告,但仍会在其中生成客户端C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\amd64\WebPricingService.cs(或将客户端放在您机器上的任何位置 - 检查控制台输出,其中读取“写入文件”)

在此处输入图像描述

希望这可以节省您一些时间。

于 2014-12-02T15:20:22.933 回答
0

万一有人撞到了这堵墙,这就是导致我的错误的原因:

我有一个操作:

<wsdl:operation name="FormatReport">
  <wsdl:documentation>Runs a report, which is returned as the response</wsdl:documentation>
  <wsdl:input message="FormatReportRequest" />
  <wsdl:output message="FormatReportResponse" />
</wsdl:operation>

它需要一个输入:

<wsdl:message name="FormatReportRequest">
  <wsdl:part name="parameters" element="reporting:FormatReportInput" />
</wsdl:message>

和另一个操作:

<wsdl:operation name="FormatReportAsync">
  <wsdl:documentation>Creates and submits an Async Report Job to be executed asynchronously by the Async Report Windows Service.</wsdl:documentation>
  <wsdl:input message="FormatReportAsyncRequest" />
  <wsdl:output message="FormatReportAsyncResponse" />
</wsdl:operation>

接受输入:

  <wsdl:message name="FormatReportAsyncRequest">
    <wsdl:part name="parameters" element="reporting:FormatReportInputAsync" />
  </wsdl:message>

输入元素是两种类型的实例:

<xsd:element name="FormatReportInput" type="reporting:FormatReportInputType"/>
<xsd:element name="FormatReportInputAsync" type="reporting:FormatReportAsyncInputType"/>

这是关键 -reporting:FormatReportAsyncInputType类型扩展(派生自)reporting:FormatReportInputType类型。这似乎使工具混淆并导致“这些成员可能无法派生”。错误。您可以在接受的答案中解决以下建议。

于 2017-06-26T16:48:33.760 回答
0

如果您使用 UPS Shipping wsdl 执行此操作,并且您希望在为不同区域(调试、开发、产品)等进行构建时将 dev 换成 prod url。您可以使用下面的命令从Ship.wsdl,然后在本例中覆盖 Ship.vb 文件中的值。

WSDL /Language:VB /out:"C:\wsdl\Ship.vb" "C:\wsdl\Ship.wsdl"  C:\wsdl\UPSSecurity.xsd  C:\wsdl\ShipWebServiceSchema.xsd  C:\wsdl\IFWS.xsd  C:\wsdl\common.xsd
于 2018-10-10T22:30:00.940 回答