プロダクション サーバー (リモート サーバー) の PHP に実装された Soap サーバーに問題があります。
WSDL モードで機能するだけの単純な Soap Server (ネイティブ PHP クラス) を実装しました。
したがって、私のコードは次のようになります。
ini_set("soap.wsdl_cache_enabled", "0");
$server = new SoapServer("wsSeguimiento.wsdl");
$server->addFunction("ResultadoDetalleExtendido");
$server->handle();
ご存知のように、「http://localhost/soapserver/wsServer.php」のような URL を使用して Web ブラウザー経由でサーバーを呼び出すと、空白のページが表示されます。 (サーバー コード)。
しかし、「http://localhost/soapserver/wsServer.php?wsdl」という末尾に「?wsdl」を付けて同じ URL を呼び出すと、サーバー (ハンドル関数だと思います) が Web ブラウザー上で XML wsdl を解決し、 text/xml コンテンツ タイプを取得し、XML 定義自体を確認できます。
現在、私の開発環境で動作しています。問題はありません。独自のサーバーをテストするために Soap クライアントを作成し、予想どおりの応答が返されるかどうかを確認しましたが、すべて正常に動作しました。しかし、コードを本番サーバーにアップロードすると、機能しません。
Firefox は、"?wsdl" 呼び出しで URL に表示されます。これは、"XML の形式が正しくありません" という典型的なエラーですが、この特定のケースでは、XML ファイルがまったくない場合のように、最初から発生しています。クライアントを使用すると、次のエラーが表示されます。
SOAP-ERROR: WSDL の解析: 'http://.../SOAP_SERVER/seguimientoServer.php?wsdl' から読み込めませんでした: 開始タグが必要ですが、'<' が見つかりません
WSDL XML ファイルの名前空間と URL を正しく変更しました。したがって、適切に機能する必要があります。しかし、そうではありません。
チャンクされたデータ、コンテンツの長さ、X-powered-by などに基づいて、HTTP ヘッダー自体に関連する既存のバグがあることがわかりました...
しかし、解決策がわかりません。
これに基づいてサーバーを少しハックしました(handle()呼び出しの後):
if( isset($_REQUEST['wsdl']) )
{
ob_clean();
echo file_get_contents( "wsSeguimiento.wsdl" );
}
そしてこれで、それは本当にうまくいきます!しかし、これで解決する必要はないと確信しています...