为什么 SoapUI 在获取 WSDL 时进行第二次调用以获取 XSD?

Why does SoapUI make a second call to get an XSD when getting a WSDL?

我正在尝试获取一组现有的 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 才能工作?我将我拥有的 XSDs 放在与 WSDL 相同的文件夹中,并将 SoapCore 指向它们,如上面的 link 所示,但问题仍然存在。

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

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

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

这可能就是 SoapUI 使用空白文件名进行调用的原因吗?此标签格式错误或有效吗?如果不包含 schemaLocation 属性,<xs:import> 的默认 path/filename 是多少?

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

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

  • 在与 SOAP Web 服务相同的端点上,然后您使用一些 URL 参数访问 XSDs,就像 SoapUI 试图做的那样,比如 ?xsd&name=identifierForSchemaHere。这类似于您使用 ?wsdl;
  • 访问 WSDL 的方式
  • 或者该位置是一些绝对 URL 路径,您可以从中获取 XSD 文件。

现在回答这个问题:

Does a Soap API endpoint have to have both a WSDL and XSD to work?

理论上两者都不需要。

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

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

进一步阅读:

  • The WSDL is not the SOAP web service
  • PHP SoapClient doesn't load WSDL(post 中解释的概念与 PHP 无关,尽管问题是);
  • Is it mandatory to have a WSDL definition accessible using ?wsdl?
  • What is the difference between ?wsdl and ?singleWsdl parameters