zoukankan      html  css  js  c++  java
  • Transport level information does not match with SOAP Message namespace URI错误的理解

    理论知识:

    转自:http://wso2.com/library/articles/differentiating-between-soap-versions-looking-soap-message/

    Using SOAP Namespace
    Every XML message contains namespaces to properly qualify the entities within it. In SOAP 1.1 and SOAP 1.2 specifications, each had defined its own unique namespaces to define the entities belonging to those specifications.
    
    SOAP 1.1 : http://schemas.xmlsoap.org/soap/envelope/
    
    SOAP 1.2 : http://www.w3.org/2003/05/soap-envelope
    
    This is the easiest and sometimes the only method some people use. You can look at the SOAP namespace of a SOAP message and easily determine its version.
    
     
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <soapenv:Header>
            .........
        </soapenv:Header>
        <soapenv:Body>
            ....
        </soapenv:Body>
    </soapenv:Envelope>
    SOAP 1.1 message
    
    You might argue that this is the only method you need to know to differentiate two different SOAP versions. This might not be the case all the time. For example, there can be a situation where you will need to know the SOAP version even before reading the SOAP message itself. Even though the previous statement seems unusual, this is how it is when we have two different object models or two different builders for the two SOAP versions. In such situations, as a developer, you cannot afford to touch the SOAP message to find out the version. Perhaps you can cheat by temporarily recording the first few events or entities, but that might not be the best solution.
    
    In the next section, we will use transport binding rules, if available, to differentiate between the two different versions.

    转自:http://wso2.com/library/559/

    A: When Apache Axis2/Java receives a SOAP message, Axis2 tries to determine the SOAP version this message adheres to. This is required for the validation purposes against the correct SOAP specification. Axis2 has two basic mechanisms to identify the SOAP version.
    
    1. Checking the namespace of the SOAP envelope. If the namespace is "http://schemas.xmlsoap.org/soap/envelope/", then it is a SOAP 1.1 message, and if the namespace is "http://www.w3.org/2003/05/soap-envelope", then it is a SOAP 1.2 message.
    
    2.If the transport medium is HTTP, Then we check for the existance of SOAPAction HTTP Header. If the message is SOAP 1.1, then there must be a SOAPAction HTTP header. If it is a SOAP 1.2 message, then there may be a SOAPAction parameter inside the Content-type header (this parameter is not mandatory according to SOAP 1.2 specification HTTP binding)
    When both the above parameters are present, Axis2 compares the outputs from those evaluations. If they do not match, then Axis2 will throw an error saying "Transport level information does not match with SOAP Message namespace URI". So if you encounter this error, check your SOAP message and HTTP headers. Applies To: Apache Axis2/Java v1.0 and higher

    进一步理论说明:

    转自:http://www.herongyang.com/Web-Services/Perl-SOAP-1-2-Request-Differences-SOAP-1-1-and-1-2.html

    This section describes differences between a SOAP 1.1 request and SOAP 1.2 request for GetSpeech Web service provided by xmlme.com.
    
     
    Remember that I goal is to use SOAP::Lite to send SOAP 1.2 request to the xmlme.com server.
    Before writing the client program, let's compare the SOAP 1.1 request with the SOAP 1.2 request provided at: http://www.xmlme.com/WSShakespeare.asmx?op=GetSpeech.
    SOAP 1.1 request: 
    
    POST /WSShakespeare.asmx HTTP/1.1
    Host: www.xmlme.com
    Content-Type: text/xml; charset=utf-8
    Content-Length: length
    SOAPAction: "http://xmlme.com/WebServices/GetSpeech"
    
    <?xml version="1.0" encoding="utf-8"?>
    <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
      <soap:Body>
        <GetSpeech xmlns="http://xmlme.com/WebServices">
          <Request>string</Request>
        </GetSpeech>
      </soap:Body>
    </soap:Envelope>
    
    
    SOAP 1.2 request:
    
    POST /WSShakespeare.asmx HTTP/1.1
    Host: www.xmlme.com
    Content-Type: application/soap+xml; charset=utf-8
    Content-Length: length
    
    <?xml version="1.0" encoding="utf-8"?>
    <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
      <soap12:Body>
        <GetSpeech xmlns="http://xmlme.com/WebServices">
          <Request>string</Request>
        </GetSpeech>
      </soap12:Body>
    </soap12:Envelope>
    I see 3 differences:
    SOAP 1.2 uses "application/soap+xml" as Content-Type and SOAP 1.1 uses "text/xml".
    SOAP 1.2 does not use SOAPAction header line.
    SOAP 1.2 uses "http://www.w3.org/2003/05/soap-envelope" as the envolope namespace and SOAP 1.1 uses "http://schemas.xmlsoap.org/soap/envelope/".
    Now I known where to pay attention to generate a correct SOAP 1.2 request.
    Last update: 2009.

    关键点:HTTP头信息里的Content-Type一定要和soap信息中的版本标识一致。

    3 differences:
    SOAP 1.2 uses "application/soap+xml" as Content-Type and SOAP 1.1 uses "text/xml".
    SOAP 1.2 does not use SOAPAction header line.
    SOAP 1.2 uses "http://www.w3.org/2003/05/soap-envelope" as the envolope namespace and SOAP 1.1 uses "http://schemas.xmlsoap.org/soap/envelope/".
  • 相关阅读:
    第72届奥斯卡最佳动画奖《老人与海》
    关不掉的手机应用程序
    李嘉诚:知识并不一定使你的财富增加
    Linux之父Linus Torvalds谈软件开发管理经验
    Google 正式发布Dart编程语言
    代码本身其实并不重要,重要的是用户
    22个基于HTML5开发的网站
    看看耶鲁大学心态 ,送给正在奋斗的人 !
    用 git 维护 vim 代码
    谈程序语言的设计及程序员心态
  • 原文地址:https://www.cnblogs.com/wangpei/p/3937541.html
Copyright © 2011-2022 走看看