名称空间是否有称为“虚拟URL”的东西?

时间:2013-07-19 15:52:44

标签: xsd wsdl xml-namespaces

我在当前作业中继承的一个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">

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

  

未找到

     

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

由于该人询问为什么某些事情以他们的方式实施已经离开,我想知道这是一个错误还是一个特征:

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

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

如果是后者, 如何运作, 哪里可以了解更多信息?

注意:上面的example.com仅用于说明,我无法真正披露我雇主的内部网址)

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

这是可能的,但不确定;没有阅读开发人员的想法,没有可靠的答案。一个理性的开发人员可能会这样做 - 即使包括我在内的很多人会说更好的做法也更合理地放置命名空间文档(可能是模式文档的形式,可能是RDDL文档的形式,可能是另一个形式)在命名空间URI。

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

并非不可能,但这不是一种似乎被广泛记录的设计技术。 (至少,至少有一个从未听过它的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。)