为什么 SoapUI 在获取 WSDL 时会再次调用以获取 XSD?

问题描述

我正在尝试使用一组现有的 WSDL 和 XSD 文件,并使用 SoapCore NuGet 包在我的 .Net Core 应用程序中创建一个 SOAP API 端点。

我通过将 SoapCore 配置为 shown here 来按预期返回 WSDL,但是,当我使用 SoapUI 基于我的 WSDL 创建一个新的 SOAP 项目时,它会执行两个请求。第一个获取 WSDL,这是我所期望的,并且成功了。但随后它会在同一端点上执行另一个请求,但使用包含的查询字符串参数 ?xsd&name=。这会导致 SoapCore 失败,因为请求要求 XSD 但没有给出文件名。

我不知道问题是出在 SoapUI、SoapCore 还是我的代码上。 SoapUI 为什么要提出这个请求?这是正常的吗? Soap API 端点是否必须同时具有 WSDL 和 XSD 才能工作?我将我拥有的 XSD 与 WSDL 放在同一文件夹中,并将 SoapCore 指向它们,如上面的链接所示,但问题仍然存在。

我通常不使用 SOAP,所以希望这个问题有意义。

更新: Bogdan 问了一个关于进口的有趣问题。 XSD 确实具有引用其他文件的导入。但是,WSDL 在 wsdl:types 元素中嵌入了 XSD。在此标记中还有导入标记,但它们没有 schemaLocation 属性。下面是一个例子:

<xs:import xmlns:xs="http://www.w3.org/2001/XMLSchema"
            namespace="http://www.starstandards.org/STAR" />

这可能是 SoapUI 使用空白文件名进行调用的原因吗?此标签格式错误还是有效?如果不包含 <xs:import> 属性schemaLocation认路径/文件名是什么?

解决方法

很可能您的 WSDL 导入了 XML 模式,而模式的位置是 SoapUI 无法解析的。

我不熟悉 SoapCore,不知道它是如何解析 XSD 导入的,但对于一般的 WSDL,导入是:

  • 在与 SOAP Web 服务相同的端点上,然后您使用一些 URL 参数访问 XSD,例如 SoapUI 正在尝试执行的操作,例如 ?xsd&name=identifierForSchemaHere。这类似于您使用 ?wsdl;
  • 访问 WSDL 的方式
  • 或者位置是某个绝对 URL 路径,您可以在其中获取 XSD 文件。

现在这个问题:

Soap API 端点是否必须同时具有 WSDL 和 XSD 才能工作?

理论上,两者都不需要。

WSDL 就像机器可读的文档。您可以使用工具指向 WSDL,这些工具可以生成允许您调用服务的代码,或者可以创建服务器存根来为您处理 SOAP 详细信息。但是,如果您构建了一个有效的 SOAP Web 服务,如果您知道如何格式化 SOAP XML 消息,那么您可以在没有 WSDL 的情况下调用它,通过使用您作为开发人员需要阅读的普通文档来了解如何与 Web 服务交互.

您不需要 WSDL,但大多数 SOAP Web 服务应该提供一个作为对必须与 Web 服务交互的客户端的帮助。当您提供 WSDL 时,您还需要提供 XSD 架构(或 WSDL 的 <types> 部分)。没有 XSD 的 WSDL 有一半的用处,因为它缺少允许客户端知道如何在 SOAP 消息中构建 XML 元素的部分。

进一步阅读: