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

时间:2014-10-22 07:00:17

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

没有名称空间前缀的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应用程序必须能够在它接收的消息中处理SOAP名称空间。它必须丢弃具有不正确名称空间的消息(参见第4.4节),并且它可以处理没有SOAP名称空间的SOAP消息,就好像它们具有正确的SOAP名称空间一样。

与我相关的是我希望处理这两个请求吗?

1 个答案:

答案 0 :(得分:1)

示例消息完全是名称空间限定的 - 它只是使用空前缀(标准中名称错误的名称空间&#39;)。

通过将XML读入DOMDocument并查看节点的.nameSpace属性,您可以轻松验证每个节点都是命名空间限定的事实。

如果相应的WSDL指定元素表单是“不合格的”,那么事情变得棘手的是正文条目的子节点。或者,如果标准编码规则适用(&#34;名称在其包含类型中是本地的访问者具有不合格的元素名称;所有其他名称都具有限定名称。&#34;)。

在这种情况下,使用空前缀(&#39;默认名称空间&#39;)要求将body entry children显式限定为没有名称空间:

<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应用程序必须能够在它接收的消息中处理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>