【问题标题】:Is SOAP 1.1 envelope without namespace prefixes valid one?没有名称空间前缀的 SOAP 1.1 信封是否有效?
【发布时间】:2014-12-17 13:51:06
【问题描述】:

没有命名空间前缀的 SOAP 1.1 信封是否有效?

我在 .Net 中开发了 ASMX Web 服务。以如下格式呼叫我并发送消息的出站客户端:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://myCustomNamespace.com/">                  
  <soapenv:Header/>                                                     
  <soapenv:Body>                                                        
    <web:Test/>  
  </soapenv:Body>  
</soapenv:Envelope>

已正确处理。当在 IBM 的 Cast Iron 下运行的客户端以以下格式发送信封时,问题就开始了:

<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">            
   <Body>                                                               
      <Test xmlns="http://myCustomNamespace.com/" />  
   </Body>
</Envelope>

与第 3 段中的 http://www.w3.org/TR/2000/NOTE-SOAP-20000508/ 相关。与 XML 的关系

一个 SOAP 应用程序应该在它生成的消息中包含由 SOAP 定义的所有元素和属性上的正确 SOAP 命名空间。 SOAP 应用程序必须能够处理它接收到的消息中的 SOAP 名称空间。它必须丢弃具有不正确命名空间的消息(参见第 4.4 节),并且它可以处理没有 SOAP 命名空间的 SOAP 消息,就好像它们具有正确的 SOAP 命名空间一样。

与所有相关的,我期望处理这两个请求吗?

【问题讨论】:

    标签: .net web-services soap web xml-namespaces


    【解决方案1】:

    示例消息是完全命名空间限定的 - 只是它使用空前缀(在标准中被错误命名为“默认命名空间”的功能)。

    您可以通过将 XML 读入 DOMDocument 并查看节点的 .nameSpace 属性来轻松验证每个节点是否符合命名空间。

    如果相应的 WSDL 指定元素形式是“不合格的”或者如果标准编码规则适用(“其名称对其包含类型本地的访问器具有不合格的元素名称,那么事情变得棘手的是主体条目的子节点; 所有其他人都有限定名称。”)。

    在这种情况下,使用空前缀(“默认命名空间”)需要将主体条目子项明确限定为没有命名空间:

    <Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">            
       <Body>                                                               
          <foo xmlns="some-URI">
             <result xmlns="">meow</result>
          </foo>
       </Body>
    </Envelope>
    

    否则它们将继承最近的封闭默认命名空间的命名空间,因此验证失败。

    没有命名空间限定的 SOAP 信封是另一回事。 SOAP 1.1 说:

    一个 SOAP 应用程序应该在它生成的消息中由 SOAP 定义的所有元素和属性上包含正确的 SOAP 名称空间。 SOAP 应用程序必须能够处理它接收到的消息中的 SOAP 名称空间。它必须丢弃具有不正确命名空间的消息(参见第 4.4 节)并且它可以处理没有 SOAP 命名空间的 SOAP 消息,就好像它们具有正确的 SOAP 命名空间一样。

    换句话说:你必须处理

    <Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">            
       <Body>                                                               
          <foo xmlns="some-URI"/>
       </Body>
    </Envelope>
    

    你可以处理

    <Envelope>
       <Body>                                                               
          <foo xmlns="some-URI"/>
       </Body>
    </Envelope>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-08
      • 1970-01-01
      • 2021-09-24
      • 2010-11-11
      • 2019-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多