我在生产服务器(远程服务器)上的 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" );
}
有了这个,它真的有效!但我敢肯定,这不一定是解决它的方法......