SOAP サーバーに問題があり、数日のうちに頭がおかしくなりました。私は、単純な SOAP-Server PHP スクリプトにも問い合わせる非常に単純な SOAP-Client PHP スクリプトを持っています。
デバッグ サーバーにこれらのスクリプトの正確なコピーがあり、完全に動作します (これは単なる hello World 関数です)。「Procedure 'ns1:testHello' not present」エラーが発生し続けます (testHello は関数名です)。
production-client が機能していることはわかっています。プロダクション サーバーから呼び出して WSDL を開発すると、完全に機能するからです。SOAPサーバーと何らかの形で相関していると思いますが、正しく機能しているかどうか、何が問題なのかを正確に知るにはどうすればよいですか?
infophp() ダンプを見ると、SOAP サーバーとクライアントの両方が有効になっていることがわかります
Soap Client enabled
Soap Server enabled
Directive Local Value Master Value
soap.wsdl_cache 1 1
soap.wsdl_cache_dir /tmp /tmp
soap.wsdl_cache_enabled 0 1
soap.wsdl_cache_limit 5 5
soap.wsdl_cache_ttl 0 86400
SOAP_1_1 と SOAP_1_2 の両方のバージョンを強制しようとしましたが、変更はありません。あらゆる種類のキャッシュを無効にしようとしましたが、変更もありません。「ns:X function not present」は通常、WSDL の設定ミスが原因であると読みましたが、それが正確なコピーである場合、どのように間違っている可能性がありますか (targetNamespace、xmlns:tns、soap:address url が実稼働サーバーを指している場合を除く)。
これは何らかの形で Web サーバーの構成設定に関連していると思い始めています。何か案は?どのような検査ができますか?
よろしくお願いします。
私のサーバーコード:
ini_set("display_errors", "off");
ini_set("soap.wsdl_cache_enabled", 0);
ini_set('soap.wsdl_cache_ttl',0);
$wsdl_url="http://SITE_URL/test.wsdl";
function testHello($functionName){
$return = "Hello, ".$functionName;
return $return;
}
$server= new SoapServer($wsdl_url, array('cache_wsdl' => WSDL_CACHE_NONE));
$server->addFunction("testHello");
$server->handle();
私のクライアントコード
ini_set("soap.wsdl_cache_enabled", 0);
ini_set('soap.wsdl_cache_ttl',0);
ini_set("display_errors", "on");
$wsdl_url="http://SITE_URL/test.wsdl";
$client=new SoapClient($wsdl_url , array('cache_wsdl' => WSDL_CACHE_NONE));
try{
$t = $client-> testHello("Test");
var_dump($t);
} catch(SoapFault $e){
var_dump($e);
}
私の WSDL ファイル
<?xml version="1.0" encoding="UTF-8" ?>
<definitions name="TLN"
targetNamespace="http://SITE_URL/test.wsdl"
xmlns:tns="http://SITE_URL/test.wsdl"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<message name="testHelloRequest">
<part name="functionName" type="xsd:string"/>
</message>
<message name="testHelloResponse">
<part name="return" type="xsd:string"/>
</message>
<portType name="testHelloPortType">
<operation name="testHello">
<input message="tns:testHelloRequest" />
<output message="tns:testHelloResponse" />
</operation>
</portType>
<binding name="testHelloBinding" type="tns:testHelloPortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
<operation name="testHello">
<soap:operation soapAction="" />
<input>
<soap:body use="encoded" namespace="" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</input>
<output>
<soap:body use="encoded" namespace="" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</output>
</operation>
</binding>
<documentation>testHello</documentation>
<service name="testHelloService">
<port name="testHelloPort" binding="testHelloBinding">
<soap:address location="http://SITE_URL/server.php" />
</port>
</service>
</definitions>