1

Windows / IISでホストされているWebサービス用に、PHPでSoapClientを作成する必要があります。ローカルのIIS+PHPからスクリプトを実行すると、機能します。Apache WebサーバーのローカルXAMPから同じスクリプトを実行すると、常に同じエラーが発生します。

致命的なエラー:キャッチされないSoapFault例外:[WSDL] SOAP-エラー:WSDLの解析:「https://online.wings.eu:8080/wsdl/IWingsWeb」からロードできませんでした

<?php
$url = 'https://online.wings.eu:8080/wsdl/IWingsWeb';

$options["connection_timeout"] = 25;
$options["location"] = $url;
$options['trace'] = 1;

$client = new SoapClient($url,$options);
print_r($client->__getFunctions());
?>

SOAPとopensslはApacheで有効になっています。Windows以外のサーバーでホストされている他のサービスにもアクセスできます。

これは私のApacheの問題ですか、それともSOAPサーバーをホストするWindowsサーバーの問題ですか?

4

1 に答える 1

0

おそらく、ApacheとIISサーバー間の接続を確立できません。以下を確認する必要があります。

  • Apacheサーバーからの8080(着信ではなく発信)ポートをブロックする可能性のあるファイアウォール、マルウェア対策プログラムなどはありますか?
  • サーバーに接続するために必要なSSL証明書またはパスワード(あるいはその両方)はありますか?はいの場合、適切なヘッダーを設定するようにPHPに指示する必要があります。
  • デフォルトのSoapClientを、curlを直接使用するものに置き換えることをお勧めします。そこで、いくつかのcurlパラメータを設定し、実際のエラーについて確認することができます。

このような:

class SoapCurlWrapper extends SoapClient {
  protected function callCurl($url, $data, $action) {
     $handle   = curl_init();
     curl_setopt($handle, CURLOPT_URL, $url);
     curl_setopt($handle, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml", 'SOAPAction: "' . $action . '"'));
     curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
     curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
     curl_setopt($handle, CURLOPT_SSLVERSION, 3);
     $response = curl_exec($handle);
     if (empty($response)) {
       throw new SoapFault('CURL error: '.curl_error($handle),curl_errno($handle));
     }
     curl_close($handle);
     return $response;
   }

   public function __doRequest($request,$location,$action,$version,$one_way = 0) {
       return $this->callCurl($location, $request, $action);
   }
 }

PHPのSOAP実装は、WSDLファイルをダウンロードするために上記のラッパーを使用しないことに注意してください(手動で行う必要があります)が、実際のWS呼び出しに使用でき、実際に失敗する理由を見つけることができます。

そして、あなたは他のように上記のクラスを使うことができますSoapClient、例えば:

$oWS = new SoapCurlWrapper($location_of_wsdl_file,$parameters);
于 2013-01-17T09:29:19.007 に答える