从 ASMX Web 服务导入 wsdl 时出现 WsdlImporter 错误

Posted

技术标签:

【中文标题】从 ASMX Web 服务导入 wsdl 时出现 WsdlImporter 错误【英文标题】:WsdlImporter Error when importing a wsdl from an ASMX web service 【发布时间】:2010-10-29 05:01:15 【问题描述】:

当尝试为此 wsdl file(来自 ASMX Web 服务)生成代理代码时,WsdlImporter(和 svcutil)报告错误。我认为 WCF 完全向后兼容 ASMX Web 服务?请帮忙

下面是 svcutil 的输出(我使用 WsdlImporter 得到了同样的错误)

Microsoft (R) 服务模型元数据工具 [Microsoft (R) Windows (R) Communication Foundation,版本 3.0.4506.648] 版权所有 (c) 微软公司。版权所有。 警告:来自命名空间“http://sch”的可选 WSDL 扩展元素“标头” emas.xmlsoap.org/wsdl/soap/' 未处理。 XPath: //wsdl:definitions[@targetNamespace='http://mycompany.com/Enterprise/WebS 服务/财务/']/wsdl:binding[@name='FinanceServiceSoap']/wsdl:operation[@name= 'ProcessNonRefPayment']/wsdl:fault[@name='fault'] 警告:来自命名空间“http://sch”的可选 WSDL 扩展元素“标头” emas.xmlsoap.org/wsdl/soap/' 未处理。 XPath: //wsdl:definitions[@targetNamespace='http://mycompany.com/Enterprise/WebS 服务/财务/']/wsdl:binding[@name='FinanceServiceSoap']/wsdl:operation[@name= 'ProcessRefPayment']/wsdl:fault[@name='fault'] 警告:来自命名空间“http://sch”的可选 WSDL 扩展元素“标头” emas.xmlsoap.org/wsdl/soap/' 未处理。 XPath: //wsdl:definitions[@targetNamespace='http://mycompany.com/Enterprise/WebS 服务/财务/']/wsdl:binding[@name='FinanceServiceSoap']/wsdl:operation[@name= 'SearchPayments']/wsdl:fault[@name='fault'] 警告:来自命名空间“http://sch”的可选 WSDL 扩展元素“标头” emas.xmlsoap.org/wsdl/soap/' 未处理。 XPath: //wsdl:definitions[@targetNamespace='http://mycompany.com/Enterprise/WebS 服务/财务/']/wsdl:binding[@name='FinanceServiceSoap']/wsdl:operation[@name= 'GetPayments']/wsdl:fault[@name='fault'] **错误:无法导入 wsdl:binding** 详细信息:给定的键不在字典中。 错误源的 XPath://wsdl:definitions[@targetNamespace='http://mycompany.com /Enterprise/WebService/Finance/']/wsdl:binding[@name='FinanceServiceSoap12'] **错误:无法导入 wsdl:port** 详细信息:导入 wsdl:binding 时出错,该 wsdl:port 是依赖的 继续。 XPath 到 wsdl:binding: //wsdl:definitions[@targetNamespace='http://mycompany.com /Enterprise/WebService/Finance/']/wsdl:binding[@name='FinanceServiceSoap12'] 错误源的 XPath://wsdl:definitions[@targetNamespace='http://mycompany.com /Enterprise/WebService/Finance/']/wsdl:service[@name='FinanceService']/wsdl:port [@name='FinanceServiceSoap12']

【问题讨论】:

【参考方案1】:

你没有要求这个,但它最终可能会帮助你更多......

您提供的 WSDL 设计过度,架构不足。

    几乎每个在 WSDL 中定义的 complexType 都有一个唯一的名称空间。这是不必要的。您不需要 XML 命名空间来保存事务消息的定义。 Waaaaay 太多的命名空间。当我查看它时,我只看到了一个命名空间 (http:///blahblah/Finance/) 的理由。你可能需要更多,但肯定不需要那么多。大量的命名空间是 wsdl.exe 工具崩溃的原因之一——它根本无法处理它。

    没有模块化。 XML Schema 应该与 WSDL 分开。对于那些合理的命名空间,为每个命名空间使用单独的 .xsd 文件,并为这些架构执行 xsd:import。可能是您有一个 XSD 文件。

    您有从通用基本类型派生的 complexTypes,但基本类型中没有任何内容。没有消息 ID,没有消息版本。这似乎很麻烦。

    提供的 WSDL 不会将端口类型映射到绑定。这是 wsdl.exe 不会从中生成代码的原因之一。 wsdl.exe 在 porttype 中的 wsdl:input 元素上查找 name 属性,该属性必须与绑定上的 wsdl:input 上的 name 属性相匹配。

    绑定太多。你真的需要 SOAP1.1、SOAP1.2、HTTPGET 和 HTTPPOST 吗?真的吗?选择一个并坚持下去。

现在该怎么办? 我想您无法控制 ASMX,并且您无权访问代码。我要做的是手动重新处理该 WSDL 以使其有意义 - 将所有这些模式分成单独的 .xsd 文件。然后从 WSDL 的一个简单子集开始,并获取它以使其工作。迭代地添加更复杂的部分,直到你拥有你需要的东西。

【讨论】:

【参考方案2】:

wsdl.exe 在导入这个 WSDL 时崩溃,所以肯定有什么问题。即使是 .NET 2.0 客户端也无法使用它。可以贴一下网络服务的代码吗?

【讨论】:

嗨达林感谢您的回复。不幸的是,我无权访问代码。

以上是关于从 ASMX Web 服务导入 wsdl 时出现 WsdlImporter 错误的主要内容,如果未能解决你的问题,请参考以下文章

访问asmx Web服务时出现错误请求

asmx 添加 Localy(XMLFile) 时无法导入 wsdl

使用 ajax() 和 jsonp 调用 asp.net 远程 Web 服务 .asmx 时出现意外令牌 <

有没有办法限制对 ASMX Web 服务的访问,即 asmx 页面及其 WSDL?

不同的 WSDL ASMX、WCF Web 服务

如何从 wsdl 生成 Web 服务