1

我在生产服务器(远程服务器)上的 PHP 上实现的 Soap 服务器出现问题。

我已经实现了一个简单的 Soap 服务器(本机 PHP 类),仅在 WSDL 模式下使用函数。

所以我的代码看起来像:

ini_set("soap.wsdl_cache_enabled", "0");

$server = new SoapServer("wsSeguimiento.wsdl");

$server->addFunction("ResultadoDetalleExtendido");

$server->handle();

现在,如您所知,当您通过 Web 浏览器使用“http://localhost/soapserver/wsServer.php”之类的 url 调用服务器时,您会得到一个空白页面 - 在我的情况下 - 或者您在那里编写的任何内容(服务器代码)。

但是,如果您在“http://localhost/soapserver/wsServer.php?wsdl”末尾使用“?wsdl”调用相同的 URL,那么服务器(我猜是句柄函数)会在 Web 浏览器上解析 XML wsdl,所以你得到一个 text/xml 内容类型,你可以看到 XML 定义本身。

现在,它适用于我的开发环境。没问题。我创建了一个 Soap 客户端来测试我自己的服务器,并查看它是否返回加速响应,并且一切正常。但是当我将代码上传到生产服务器时,它不起作用。

Firefox 在 url 上显示“?wsdl”调用,典型的错误是“XML malformed”,但在这种特殊情况下,它是从一开始就发生的,就像根本没有 XML 文件一样。如果我使用我的客户端,我会收到错误消息:

SOAP 错误:解析 WSDL:无法从“http://.../SOAP_SERVER/seguimientoServer.php?wsdl”加载:需要开始标记,未找到“<”

我已经正确更改了 WSDL XML 文件中的名称空间和 URL。所以它必须正常工作。但事实并非如此。

我发现存在与 HTTP 标头本身相关的现有错误,基于分块数据、内容长度、X-powered-by 等等......

但我没有看到解决方案。

基于此,我在服务器上做了一些小改动(在 handle() 调用之后):

if( isset($_REQUEST['wsdl']) )
{
    ob_clean();
    echo file_get_contents( "wsSeguimiento.wsdl" );
}

有了这个,它真的有效!但我敢肯定,这不一定是解决它的方法......

4

1 回答 1

0

看起来您的 wsdl 开头有一个无效字符。也许是一个空间?

于 2011-11-11T12:49:31.070 回答