2009-07-28 28 views
0

私はEJBで作成されたSOAPサービスと通信しています。間欠的に失敗し、確実に再現できるケースが見つかりました。SOAP PHPの解析エラー?

私はXMLのように見えますが、最後のレスポンスを取得すると、以下に挙げるものが得られます(有効なXMLのように見えます)。

どのような考えですか?

ソープ障害:

object(SoapFault)#2 (9) { 
    ["message:protected"]=> string(33) "looks like we got no XML document" 
    ["string:private"]=> string(0) "" 
    ["code:protected"]=> int(0) 
    ["file:protected"]=> string(40) "/Users/josh/Sites/blahblahblah/test-update.php" 
    ["line:protected"]=> int(26) 
    ["trace:private"]=> array(2) { 
     [0]=> array(4) { 
      ["function"]=> string(6) "__call" 
      ["class"]=> string(10) "SoapClient" 
      ["type"]=> string(2) "->" 
      ["args"]=> array(2) { 
       [0]=> string(24) "UpdateApplicationProfile" 
       [1]=> array(1) { 
        [0]=> array(2) { 
         ["suid"]=> string(36) "62eb56ee-45de-4971-9234-54d72bbcd0e4" 
         ["appid"]=> string(36) "6be2f269-4ddc-48af-9d47-30b7cf3d0499" 
        } 
       } 
      } 
     } 
     [1]=> array(6) { 
      ["file"]=> string(40) "/Users/josh/Sites/blahblahblah/test-update.php" 
      ["line"]=> int(26) 
      ["function"]=> string(24) "UpdateApplicationProfile" 
      ["class"]=> string(10) "SoapClient" 
      ["type"]=> string(2) "->" 
      ["args"]=> array(1) { 
       [0]=> array(2) { 
        ["suid"]=> string(36) "62eb56ee-45de-4971-9234-54d72bbcd0e4" 
        ["appid"]=> string(36) "6be2f269-4ddc-48af-9d47-30b7cf3d0499" 
       } 
      } 
     } 
    } 
    ["faultstring"]=> string(33) "looks like we got no XML document" 
    ["faultcode"]=> string(6) "Client" 
    ["faultcodens"]=> string(41) "http://schemas.xmlsoap.org/soap/envelope/" 
} 

とクライアントを使用して、実際の生のXMLレスポンス - > __でgetLastResponse():

<env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'> 
    <env:Header> 
    </env:Header> 
    <env:Body> 
     <ns2:UpdateApplicationProfileResponse xmlns:ns2="blahblahblah"> 
      <paramname>status</paramname> 
      <paramname>location</paramname> 
      <paramname>timezone</paramname> 
      <paramname>homepage</paramname> 
      <paramname>nickname</paramname> 
      <paramname>firstName</paramname> 
      <paramname>languages</paramname> 
      <paramname>color</paramname> 
      <paramname>lastName</paramname> 
      <paramname>gender</paramname> 
      <paramvalue></paramvalue> 
      <paramvalue></paramvalue> 
      <paramvalue></paramvalue> 
      <paramvalue></paramvalue> 
      <paramvalue>XXX XXX</paramvalue> 
      <paramvalue>XXX</paramvalue> 
      <paramvalue></paramvalue> 
      <paramvalue>CA0008</paramvalue> 
      <paramvalue>XXX</paramvalue> 
      <paramvalue></paramvalue> 
     </ns2:UpdateApplicationProfileResponse> 
    </env:Body> 
</env:Envelope> 
+1

wiresharkを使って、何が行を超えているのか正確に確認できますか? – troelskn

+0

残念ながら、私のテスト環境では、そのすべてがVPNを介してトンネリングされています。だから私が得られるのは、ipsecパケットです...この問題の冒頭で、VPNを通過していないときを見ました。それは完全に有効です(迷いのない空白なし) – Josh

答えて

2

ええ、問題は、不適切な文字データやparamvalue子のいずれかに渡されているものと何らかの関係があるためです。トレースと__getLastRequest()を使用しても、表示されているか、表示されていないように見えます。

残念ながら、サーバーコードに直接アクセスすることはできません。 EJBを使用して作成されたWSから直接出力されます。開発者はXML自体にアクセスすることはできません。そのため、空白がありません。何も空白ではないようです - 確かに__getLastRequest()を使用する空白はありませんが、それはエラーの原因を探すのに最適な場所でしたが、SoapClientのPHPページのコメントによると、

私は基本的に悪いの呼び出しを無視して問題を解決し、そしてparamnamesとparamvaluesのそれぞれを「リセット」、私は悪いデータを一掃するような...とにかく

、私は明示的にしなかったことを残念それを引き起こしていたものを見つけ出し、瞬時に災害を避けました。

編集:これは のため、制御文字がEJBフレームワークから返されたxmlに移動していたためです。それはnullであるはずだったので、それを表現するために制御文字を使いました。そして、PHPのSOAPは、 "有効な" xmlではないのでbarfedされました。私は例外の場合に__getLastRequest()を使用して、応答の手動解析を書くことで問題を解決しました。

+0

情報ありがとう、とにかく! –

1

ここで伝えるのは難しいです。あなたがチェックかもしれない物事のカップル:

  • がありません(絶対になし)空白はどちらかである先頭またはXML/SOAPデータ
  • の終わりに多分にエコーされたいくつかの誤りがあるかもしれませんことを確認してください標準出力(SOAPデータの前/後)

WebserviceのURLをブラウザから呼び出すとどのような出力が得られますか?

あなたは、サーバー側のトレースの任意の種類を取得し、それを示している可能性があります(それはあなたがSOAPを使用されることはありませんが、それは「悪い要求」のような何かを言う必要があるとして、多くを行うだろう)役に立ったことがありますか?

まだ何も見つけられない場合は、Webサービスを使用してエラーが発生した前回、私は気づかなかったので、私はインターネット上で起こっていたことを "嗅ぐ"ために、ネットワーク。時には助けてもらえますが、それをするのは嫌です。

0

私は、PHPの5.2.6以降では、SOAPの返信用封筒Bug #44882 SOAP extension object decoding bugを解析するときにPHPが鳴るという問題があると思います。私は、5.2.10と5.3.5で完璧に動作するいくつかのコードを持っています。例外を発生させるかfalseを返す代わりに、SoapClient-> methodName(params)は単に空白のオブジェクトを返すだけです。同様の問題が発生した場合は、最新の5.2または5.3リリースに更新してください。