2009-07-28 69 views
0

我与EJB创建SOAP服务通信 - 它间歇性失败,我发现我在哪里可以可靠地重现的情况下。SOAP PHP解析错误?

我得到一个时髦的屁股SOAP错误,说:“看起来我们有没有XML”,然而,检​​索响应最后,当我得到了什么是下面列出(和什么样子有效的XML我)。

有什么想法?

SOAP错误:

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 2009-07-28 20:17:24

+0

不幸的是,它的全部都在我的测试环境中通过一个VPN隧道,所以我得到的只是ipsec数据包......当我没有通过vpn时,我看了一下,在这个问题的最初阶段,它看起来完全有效(没有流浪的空白) – Josh 2009-07-29 21:59:07

回答

2

呀,所以这个问题有事情做了一块坏的字符数据之类的东西在paramvalue孩子中的一个被传递。即使使用trace和__getLastRequest(),它看起来不可见,或者被剥离。

我遗憾的是没有服务器直接访问代码。它直接从WS输出使用EJB创建 - 开发商必须将XML本身并没有上网,所以不存在杂散空白。根据SoapClient的php页面上的评论,似乎根本没有任何空白 - 当然没有使用__getLastRequest()的空白,尽管这是寻找错误原因的好地方。

我通过基本忽略坏的号召,“复位”每个paramnames和paramvalues的,这样我消灭坏数据解决了这个问题...

不管怎么说,真可惜,我没有明确找出是什么原因造成的,但现在避免了灾难。

编辑:解决此问题自 控制字符正在滑入由EJB框架返回的xml。它应该是零,所以它使用的控制字符来代表它,和PHP SOAP barfed,因为它不是“有效”的XML。我通过在异常情况下使用__getLastRequest()手动解析响应来解决问题。

1

这里很难说;事情夫妇您可以检查:

  • 确保不存在(绝对无)白色空间无论是在开头或XML/SOAP数据的末尾
  • 也许可能会有一些错误都会以标准输出(即SOAP数据之前/之后?)

如果您尝试从浏览器调用Webservice的URL,会得到什么样的输出?

(它会做很多,因为你不会使用SOAP,但它应该这样说:“错误的请求”)

你得到任何形式在服务器端跟踪的,可能表明有错误/问题/可能有用吗?

如果仍然无法找到任何东西,上次我使用Web服务并发生错误时我找不到原因,于是我结束了使用空灵(现称为Wireshark)来“嗅探”发生了什么网络。有时帮助,但我讨厌这样做。

0

我认为PHP 5.2.6及以下版本存在一个问题,导致PHP在解析SOAP返回信封Bug #44882 SOAP extension object decoding bug时窒息。我有一些在5.2.10和5.3.5上完美工作的代码,它们在5.2.6上默默无闻。 SoapClient-> methodName(params)只是简单地返回一个空白对象,而不是引发异常或返回false。如果您看到类似的问题,请更新到最新的5.2或5.3版本。