10 Replies Latest reply on Mar 23, 2010 4:11 AM by Krish.praveen

    Flex and Soap Mismatch

    joshua_shizny

      I have a problem with soap and flex 3.  I have created a webservice through the import webservice menu in Flex Builder.  If I use the service as is I get a security error because the crossdomain policy on the remote server doesn't comply.  So, instead I am using a php proxy to relay the webservice through my server and out to the webservice back to the server back to Flex.  When I try to do this I get a SOAP mismatch error coming from the below code.

      else if (envNS.uri != SOAPConstants.SOAP_ENVELOPE_URI)
              {
                  throw new Error("SOAP Response Version Mismatch");
              }

      I went back in and checked the value of envNS.uri and SOAPConstants.SOAP_ENVELOPE_URI in both the previously described situations (php proxy and straight security riddled call).  In the security riddled call the two variables match.  In the proxy call I get back differing values of envNS.uri and SOAPConstants.SOAP_ENVELOPE_URI.

      Can somebody tell me why the variables are not matching when put through the php proxy.  The php is simple, just curl, so I've pasted it below. 

      ///////START PHP SNIPPET

      $url = $_GET['url'];
      $headers = $_GET['headers'];
      $mimeType = $_GET['mimeType'];

      //Start the Curl session
      $session = curl_init();

      // Don't return HTTP headers. Do return the contents of the call
      curl_setopt($session, CURLOPT_URL, $url);
      curl_setopt($session, CURLOPT_HEADER, ($headers == "true") ? true : false);
      curl_setopt($session, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
      curl_setopt($session, CURLOPT_FOLLOWLOCATION, 1);
      curl_setopt($session, CURLOPT_RETURNTRANSFER, 1);

      // Make the call
      $response = curl_exec($session);

      if ($mimeType != "")
              {
              // The web service returns XML. Set the Content-Type appropriately
              header("Content-Type: ".$mimeType);
      }

      echo $response;

      curl_close($session);

      //END PHP SNIPPET

      Any help would be great.  Thanks,

      Josh

        • 1. Re: Flex and Soap Mismatch
          joshua_shizny Level 1

          Some more info...

           

          I'm running everything over https

           

          When I create the wsdl code from flex builder wizard, I have to select an alternative port to connect with the soap1.1 version (on the same screen where you specify the services you want to connect to).  Is it possible that when I run the php proxy and curl that I somehow lose the correct port to connect to 1.1 and get 1.2 response back.  If so, anybody know how I could correct that?

          • 2. Re: Flex and Soap Mismatch
            joshua_shizny Level 1

            I just don't get the overall picture here with this wsdl stuff with flex, so I've got some more questions and more info.  Firstly, I don't have a services-config.xml file... Do I need one?  If so how, where do I create it.  I've seen a bunch of partial info on the subject but nothing really through.  All my stuff is going from https to https, the site is hosted on https and the service is located on https.  Does that matter.  I have control over my server and can put cross-domain files on it.  I have a proxy written with curl trying to relay the call to the service.  Do I need to do anything special with that because I'm am going across https?  I guess the port deal selector on the flex wsdl creation wizard is really a namespace and not a more traditional communication port number.. Is that correct?  

            • 3. Re: Flex and Soap Mismatch
              joshua_shizny Level 1

              Also, here is my crossdomain file on the root of my server

               

              <?xml version="1.0"?>
                  <!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
                      <cross-domain-policy>
                          <allow-http-request-headers-from domain="*" headers="*"/>
                          <allow-access-from domain="*"/>
                      </cross-domain-policy>

               

              Does this look good considering https?

              • 4. Re: Flex and Soap Mismatch
                joshua_shizny Level 1

                This is what I get if I don't pass a rootUrl in to the AbstractWebService constructor (that's how I use the php proxy)....

                 

                FaultEvent fault=[RPC Fault faultString="Security error accessing url" faultCode="Channel.Security.Error" faultDetail="Destination: DefaultHTTPS"] messageId=null type="fault" bubbles=true cancelable=true eventPhase=2]

                 

                Which, by the way when I'm working in debug mode on my computer works just fine until I upload to server.

                • 5. Re: Flex and Soap Mismatch
                  joshua_shizny Level 1

                  When instantiating webservice (implements webservice) with this line (no proxy/destination url, but rootUrl)

                   

                  this.myService = new ModpayWeb(null, "https://www.mydomain.com/amfphp/services/mpNd.php?url=https%3A%2F%2Fsecure.modpay.com%2Fws %2Fmodpay.asmx%3Fwsdl");

                   

                  I get a soap envelop of

                   

                  http://schemas.xmlsoap.org/wsdl/

                   

                  which does not match my static const

                   

                  public static const SOAP_ENVELOPE_URI:String = "http://schemas.xmlsoap.org/soap/envelope/";

                   

                  and gives me a soap mismatch error

                   

                  but when I go directly to the source and don't use the proxy I get back an envelop of

                   

                  http://schemas.xmlsoap.org/soap/envelope/

                   

                  which does match my predefined const

                   

                  but I get a security error channel .... DefaultHttps

                   

                  ??

                  • 6. Re: Flex and Soap Mismatch
                    joshua_shizny Level 1

                    Anyone, any ideas?   I'm really stuck here.  I had somebody in the flex user group tell me that I should just run my wsdl through php and make a weborb / amfphp connection from flex to server but that is going to be a ton of work and it seems that using flex's built in wsdl stuff would be the way to go.

                    • 7. Re: Flex and Soap Mismatch
                      joshua_shizny Level 1

                      Well,

                       

                      After fighting for days trying to get flex to call a php proxy to relay wsdl info because of security issues (no cross domain on remote server), The company was nice enough to put me on their crossdomain file.  So, I'm thinking good, but I was wrong.  I still get a security violation....

                       

                      FaultEvent fault=[RPC Fault faultString="Security error accessing url" faultCode="Channel.Security.Error" faultDetail="Destination: DefaultHTTPS"] messageId=null type="fault" bubbles=true cancelable=true eventPhase=2

                       

                      What is up with that.  I thought that the cross-domain file would handle that.  Here is the cross domain file on the root of the wsdl service

                       

                      <?xml version="1.0" encoding="UTF-8"?>
                      <!-- the purpose of this document is to allow FLASH web applications to access the  APIs. -->
                      <!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
                      <cross-domain-policy>
                          <allow-access-from domain="*.shipnotic.com"/>
                      </cross-domain-policy>

                       

                      I am at https://www.shipnotic.com and am accessing a wsdl at https:// at well.

                       

                      anybody know why this is still happening with crossdomain support?

                       

                      Thns,

                      • 8. Re: Flex and Soap Mismatch
                        joshua_shizny Level 1

                        Well now it doesn't matter.  I got it running through a php proxy.  Here is what I ended up with.  Hope this saves somebody else 3 days.

                         

                        <?

                        $soapRequest = file_get_contents("php://input");

                        $soapAction = $_SERVER['HTTP_SOAPACTION'];

                        $url = 'https://secure.thedomain.com/ws/theservice.asmx?wsdl';

                         

                        $header[] = "POST /ws/theservice.asmx HTTP/1.1";

                        $header[] = "Host: www.shipnotic.com";

                        $header[] = "Content-Type: text/xml; charset=utf-8";

                        $header[] = "Content-length: ".strlen($soapRequest);

                        $header[] = "SOAPAction: ".$soapAction;

                         

                        $ch = curl_init();

                        curl_setopt($ch, CURLOPT_URL,$url);

                        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

                        curl_setopt($ch, CURLOPT_TIMEOUT, 10);

                        curl_setopt($ch, CURLOPT_CUSTOMREQUEST,'POST');

                        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);

                        curl_setopt($ch, CURLOPT_POST, TRUE);

                        curl_setopt($ch, CURLOPT_POSTFIELDS, $soapRequest);

                        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

                        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

                         

                        $result = curl_exec($ch);

                        echo $result;

                        curl_close($ch);

                        ?>

                        • 9. Re: Flex and Soap Mismatch
                          joshua_shizny Level 1

                          Answered

                          • 10. Re: Flex and Soap Mismatch
                            Krish.praveen Level 1

                            Hi,

                             

                            I too facing the issue with web services.

                             

                            Error: SOAP Response Version Mismatch

                            at mx.rpc.soap::SOAPDecoder/decodeEnvelope()[C:\autobuild\3.3.0\frameworks\projects\rpc\src\ mx\rpc\soap\SOAPDecoder.as:266]

                            at mx.rpc.soap::SOAPDecoder/decodeResponse()[C:\autobuild\3.3.0\frameworks\projects\rpc\src\ mx\rpc\soap\SOAPDecoder.as:236]

                             

                            Previously, My web servieces are deployed in 32bit server now its moved to 64bit server.

                             

                            As you found the answer for this, can you help out to fix the same.

                             

                            Any further details you are looking for, let me know.

                             

                            Thanks,

                            Krishna