【问题标题】:Is there such thing called "virtual URL" for a namespace?命名空间是否存在称为“虚拟 URL”的东西?
【发布时间】:2013-07-19 15:52:43
【问题描述】:

我在当前工作中继承的其中一个 Web 服务包含一个 WSDL 模式,该模式具有以下命名空间定义:

<xs:schema 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" 
  xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" 
  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
  xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
  xmlns:mns="http://my.example.com/sumproj/msgs.xsd" 
  xmlns:tns="http://my.example.com/sumproj" 
  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
  targetNamespace="http://my.example.com/sumproj/msgs.xsd" 
  elementFormDefault="qualified">

上面列出的所有外部 URL 都可以通过网络浏览器访问,但内部 URL(my.example.com 域)只会产生“未找到”错误:

未找到

在此服务器上找不到请求的 URL /sumproj/msgs.xsd。

既然有人问为什么某些事情是按照它们的方式实现的,我想知道这是一个错误还是一个功能:

  • 创作开发人员是否打算将命名空间 XSD 放在该 http://my.example.com 服务器上,但根本没有实现它?

  • 或者它是某种类型的安全功能,其中 URL 只能由 Web 服务通过配置 XML 访问,当它实际访问 localhost 或类似时有效地将这个 URL 定义为虚拟?

如果是后者,如何这样做以及在哪里我可以了解更多信息?

注意:上面的example.com仅用于说明,我不能真正透露我雇主的内部URL)

【问题讨论】:

    标签: xsd wsdl xml-namespaces


    【解决方案1】:

    创作开发者是否打算将命名空间 XSD 放在该 http://my.example.com 服务器上,但根本没有实现它?

    这是可能的,但不确定;如果不阅读开发人员的想法,就不可能有明确的答案。一个理性的开发人员可能会这样做——即使包括我在内的许多人会说将命名空间文档(可能以模式文档的形式,可能以 RDDL 文档的形式,可能以另一个form) 在命名空间 URI 中。

    或者它是某种类型的安全功能,其中 URL 只能由 Web 服务通过配置 XML 访问,在实际访问 localhost 或类似时有效地将这个 URL 定义为虚拟? p>

    并非不可能,但这并不是一种似乎被广泛记录的设计技术。 (至少,至少有一个 XML 极客从未听过它的建议。)所以我猜答案是:可能不是原作者的意图。

    您能否指出我可以阅读此内容的权威来源?

    XML 命名空间的权威来源是由 Tim Bray 等人编辑的文档“Namespaces in XML 1.0 (Third Edition)”和“Namespaces in XML 1.1 (Second Edition)”。并分别于 2009 年和 2006 年由万维网联盟出版。

    很难简明扼要地证明否定,但对规范的检查应该清楚地表明,它没有要求用作命名空间名称的 URI 应该是可解引用的。第 2.1 节说“XML 命名空间由 URI 引用 [RFC3986] 标识”,但规范中没有任何内容要求取消引用命名空间名称。第 2.3 节将命名空间名称匹配的过程定义为对字符串身份的测试,并指出这意味着相同 URI 的等效形式(例如 http://www.example.org/winehttp://www.Example.org/wine)对于命名空间名称而言不被视为相等匹配。如果要求命名空间处理器取消引用命名空间名称,这将毫无意义。

    W3C 技术架构组 (TAG) 在其文档 Architecture of the World Wide Web, Volume One 中从更高层次的角度讨论了这一复杂问题。具体见

    • 第 3.5 节(阐明了“引用并不意味着取消引用”的原则:“应用程序开发人员或规范作者不应要求在每次引用时对表示进行网络检索。”
    • 关于 XML 命名空间的第 4.5.3 节
    • 第 4.5.4 节关于命名空间文档(TAG 推荐)

    另见this related question(以及我对此的回答)。

    如果名称空间 URL 确实指向资源,这是否必然意味着 WSDL 模式必须在运行时咨询它?

    没有。 WSDL 可以对 WSDL 文档中名称空间名称的使用施加额外的规则,但是您引用的文档片段来自 XSD 模式文档。 XSD 规范不要求取消引用命名空间名称(尽管它确实建议将其作为一种可能的策略来定位 XSD 模式文档以用于验证事件)。

    如果答案是否定的,它可以在运行时咨询它吗?还是只供人类阅读?

    处理器取消引用命名空间名称并没有被禁止,但一些权威机构不鼓励这样做。当广泛部署的软件在每次运行或每次读取 XML 文档时取消引用名称空间名称时,结果可能是过多和不必要的网络流量。 W3C 多年来一直遭受这种不必要的流量的困扰,现在以人为的缓慢速度为所有模式提供服务,以说服用户向他们的软件供应商投诉。 (有关详细信息,请参阅 Ted Guild 的 2008 年 blog post。)

    【讨论】:

    • 我没有比这更详细的答案了,参考了我的每一个问题。谢谢!
    【解决方案2】:

    XML 命名空间是 URI(统一资源标识符),旨在区分作者对元素“book”的含义,例如,与可能出现在任何其他 XML 文档中的元素“book”的含义。

    如果我为我的架构选择一个命名空间,我需要绝对确定它不会与其他人可能选择的命名空间相同。为了确保不会发生这种冲突,作者通常使他们的命名空间以他们拥有的域名开头。这使它们看起来像 URL,但实际上并没有要求让命名空间 URI 实际上指向一个有用的资源,或者实际上是任何东西。有用的组织,如 w3c,实际上在这些 URI 上发布资源,这就是上述文档中的外部命名空间起作用的原因。

    【讨论】:

    • 我在你的回答中读到的最重要的一条信息是 “实际上并没有要求让命名空间 URI 实际上指向一个有用的资源,或者实际上任何东西。” 你能告诉我一个权威的来源,我可以在这里阅读吗? (我试图在 w3.org 中找到它,但找不到)另外,如果名称空间 URL 确实 指向资源,这是否必然意味着 WSDL 模式 必须 在运行时咨询它?如果答案是否定的,可以在运行时咨询它吗?还是仅用于人类阅读?现在感谢 +1。
    • 在 w3schools 上的 this page 上显示“解析器未使用命名空间 URI 来查找信息。”无论如何,由于 URL 上的内容没有标准,因此如果要下载任何内容,它不知道如何处理该资源。关于此事的wiki entry 引用了this 12-year-old document,它提出了一个尚未被采用的标准。
    猜你喜欢
    • 1970-01-01
    • 2014-01-16
    • 2019-09-19
    • 2018-10-28
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    相关资源
    最近更新 更多