SoapServer,handle()上的错误 - 未设置过程

时间:2014-04-30 20:12:13

标签: php fault soapserver

所以错误是:

PHP Fatal error: Procedure 'sup:set_availability' not present in XMLSoapServer.php

我在开发环境(MAMP)上收到此错误。

这是由无效的XML字符串引起的,其中'sup'命名空间未定义:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<SOAP-ENV:Envelope xmlns:SOAPSDK1="http://www.w3.org/2001/XMLSchema" 
    xmlns:SOAPSDK2="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:SOAPSDK3="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Body>
        <sup:set_availability>
            <SetAvailability>
                ...
            </SetAvailability>
        </sup:set_availability>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

(这是一个外部请求,所以我不能去纠正来源 - 我能做到,但至少不能在短时间内通知。)

问题是我有两个处理相同请求的服务器。没有错误。所以我的任务是找出原因:)

一些细节:

  • 服务器1:php 5.3.2
  • 服务器2:php 5.4
  • 开发:php 5.4

到目前为止我检查过的事情:

  • 代码与svn-checkout相同
  • 没有隐藏的开发或仅限制作设置
  • apache config是相同的
  • 禁用wsdl缓存,清除缓存的wsdl
  • php.ini设置相同,但libxml2:
  • 除外

服务器1的版本为2.6.26,服务器2的版本为2.7.7 - 请求的工作方式就像魅力一样 我的开发环境有lixml2版本2.8.0 - 并且确实抛出致命错误。

我的猜测是(或者是)libxml2导致错误 - 但是我找不到关于这个主题的任何资源 - 我也没有成功地将我的本地libxml2版本降级到2.6或2.7。

那么......对此有何看法?

4 个答案:

答案 0 :(得分:2)

我不知道问题是什么......但是因为原生的PHP SoapClient似乎总是有点不透明&#34;对我来说,我喜欢使用Dklab_SoapClient library

它使用Curl检索Soap数据,它比原生PHP类灵活得多。 另外,如果你需要的话,你甚至可以扩展它来添加你自己的功能:) 我猜这会解决你的问题。

但是,如果您不想使用外部库,我不知道可能导致这种情况的原因......

答案 1 :(得分:2)

我认为缺少变量传递给soap client.Check with soap client working or notly

答案 2 :(得分:2)

我建议采用不同的角度来解决这个问题。

您可以在将请求提供给XML解析器之前修改请求,而不是破坏XML解析器。如果请求不存在,请将sup命名空间添加到请求中。最好将此更改推送到生产环境并更新/修复生产XML解析器。

一旦外部源获得他们的软件工作,就删除这个黑客​​。

答案 3 :(得分:0)

这听起来像是服务器配置的问题。 WSDL URI对于您的开发机器可能是错误的,因此当soapserver将自己引入WSDL时,它无法找到该函数,因为它正在查找错误的服务器。

虽然名称空间前缀仍未定义,但XML仍然是错误的。我不希望它安全地工作,因为这不是有效的XML,并且SOAP需要有效的XML才能工作。

使用LIBXML 2.9.1进行的快速测试显示,错误的XML块由DOMDocument加载并带有警告但保留(包括前缀)。如果您可以访问基础请求文档,则可以自己添加:

// just test code to mock a DOMDocument having the fault XML from question
$doc  = new DOMDocument();
$back = libxml_use_internal_errors(TRUE);
$doc->loadXML($xml);
libxml_use_internal_errors($back);

// poc to add the prefix definition
$doc->documentElement->setAttributeNS(
    'http://www.w3.org/2000/xmlns/', 'xmlns:sup', 'sup:uri'
);

该文件是:

<SOAP-ENV:Envelope xmlns:SOAPSDK1="http://www.w3.org/2001/XMLSchema" 
        xmlns:SOAPSDK2="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:SOAPSDK3="http://schemas.xmlsoap.org/soap/encoding/" 
        xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
        xmlns:sup="sup:uri">
    <SOAP-ENV:Body>
        <sup:set_availability>
            <SetAvailability>
                ...
            </SetAvailability>
        </sup:set_availability>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

如您所见,已添加前缀定义。您可以在SoapServer::handle()之前拦截收件请求,更改并将其注入handle($soap_request)

  • SOAP操作:$_SERVER['HTTP_SOAPACTION']
  • 请求正文:file_get_contents( 'php://input')
  • 请参阅:SoapServer::handle()