在我创建的 WSDL 上运行 wsdl.exe 时,出现此错误:
错误:无法从命名空间“SomeNS”导入绑定“SomeBinding”。
- 无法导入操作“someOperation”。
- 这些成员可能无法派生。
我正在使用文档文字样式,据我所知,我正在遵守所有规则。
总而言之,我有一个有效的 WSDL,但该工具不喜欢它。
我正在寻找的是是否有人对 wsdl.exe 工具有很多经验并且知道一些我不知道的秘密问题。
我遇到了同样的错误信息。挖了一会,发现除了wsdl文件外,还可以提供xsd文件。因此,除了 .wsdl 之外,在 wsdl 命令的末尾还包含/导入了 .xsd 文件,如下所示:
wsdl.exe myWebService.wsdl myXsd1.xsd myType1.xsd myXsd2.xsd ...
Wsdl 给出了一些警告,但它确实创建了一个好的服务接口。
有时您必须更改您的代码。消息部分名称不应该相同;)
<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>
在我的情况下,问题是不同的,这里有很好的描述:
每当部件的名称是“参数”时,.Net 假定使用 doc/lit/wrapped 并相应地生成代理。如果即使使用了“参数”一词,wsdl 也不是 doc/lit/wrapped(如上一个示例所示),.Net 可能会给我们一些错误。哪个错误?你猜对了:“这些成员可能不是派生出来的”。现在我们可以理解错误的含义:.Net 尝试省略根元素,因为它认为使用了 doc/lit/wrapped。然而,这个元素不能被删除,因为它不是虚拟的——它应该由用户从几个派生类型中主动选择。
修复如下,对我来说非常有效:
修复它的方法是在文本编辑器中打开 wsdl 并将部件名称从"parameters"更改为"parameters1"。现在 .Net 将知道生成一个 doc/lit/bare 代理。这意味着一个新的包装类将作为根参数出现在代理中。虽然这可能是一个更乏味的 api,但这不会对有线格式产生任何影响,并且代理是完全可互操作的。
(我强调)
@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
(或将客户端放在您机器上的任何位置 - 检查控制台输出,其中读取“写入文件”)
希望这可以节省您一些时间。
万一有人撞到了这堵墙,这就是导致我的错误的原因:
我有一个操作:
<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
类型。这似乎使工具混淆并导致“这些成员可能无法派生”。错误。您可以在接受的答案中解决以下建议。
如果您使用 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