0
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Body>
        <SOAP-ENV:Fault>
            <faultcode>WSDL</faultcode>
            <faultstring>
            SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://testws.localhost/album/wsdl' : failed to load external entity "http://testws.localhost/album/wsdl"
            </faultstring>
        </SOAP-ENV:Fault>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Zend Framework 2.2.1 を使用して、PHP で簡単なテスト Web サービスを作成しようとしています。XAMPP v1.8.2-0 を使用しています。インストールされているphpのバージョンは5.4.16です。http://framework.zend.com/manual/2.0/en/user-guide/skeleton-application.htmlにあるスケルトン アプリケーションのチュートリアルに従って、コントローラーが機能するようになりました。

wsdl パスは testws.localhost/album/wsdl または testws.localhost/album?wsdl です。サービスは testws.localhost/album にあります。testws.localhost の代わりに 127.0.0.1 を使用しても違いはありません。

WSDL の URL にアクセスすると、有効な WSDL ファイルのように見えるものが返され、XMLSpy がそれをロード/検証します。ブラウザーでサービスにアクセスすると、上記のエラー応答が返されますが、WSDL を読み込めない理由の詳細は示されません。

生成された WSDL 出力をファイルに保存し、そのパスを使用して、soap リクエスト メソッド内で php でテキストとして生成すると、すべて同じエラーが発生します。'X' からロードできませんでした: 外部エンティティ 'X' をロードできませんでした。WSDL ファイルは、アプリケーション ディレクトリ内の場所から読み取って、エコー アウトできます。

私はこれを解決するために数日を費やし、ここやウェブで同様の質問をたくさん見ましたが、それらはすべて魔法のように解決するか、受け入れられた答えがなく、何も提案されませんでした. コードは以下に含まれています。他の情報が必要な場合はお知らせください。私は zend フレームワーク / php / xampp に比較的慣れていないため、これで完全に停止しました。

AlbumController.php

<?php
namespace Album\Controller;

require_once 'Soaptest.php';

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Zend\Soap\Server;
use Zend\Soap\AutoDiscover;

class AlbumController extends AbstractActionController
{
    private $_WSDL_URI = "http://testws.localhost/album/wsdl";
    private $_URI = "http://testws.localhost/album";

    public function indexAction()
    {    
        if(isset($_GET['wsdl'])) 
        {
            $this->handleWSDL();
        } 
        else 
        {
            $this->handleSOAP();
        }
        return $this->getResponse();
    }

    public function wsdlAction()
    {   
        $this->handleWSDL();
        return $this->getResponse();
    }

    private function handleWSDL() {
        $autodiscover = new AutoDiscover();
        $autodiscover->setUri('Soaptest');
        $autodiscover->setClass($this->_URI);
        $autodiscover->handle();
    }

    private function handleSOAP() {
        try 
        {
            $server = new Server($this->_WSDL_URI);
            $server->setClass('Soaptest');
            $server->handle();          
        } 
        catch (Exception $E) 
        {  
            $E->faultstring->dump("error.wsdl"); 
        }  
    }
}

Soaptest.php

<?php
class Soaptest {
    /**
     * This method returns a string
     * 
     * @param String $value
     * @return String
     */
    public function hello($value) {
        return "hi";
    }
}

httpd-vhosts.conf で

<VirtualHost testws.localhost:80>
    DocumentRoot "C:/xampp/htdocs/ws/ZendApp/public"
    ServerName testws.localhost
    ServerAlias www.testws.localhost
    SetEnv APPLICATION_ENV "development"
    <Directory "C:/xampp/htdocs/ws/ZendApp/public">
        DirectoryIndex index.php
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

ホストファイル

127.0.0.1           testws.localhost localhost

wsdl xml

<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://testws.localhost/album" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" name="Soaptest" targetNamespace="http://testws.localhost/album">
    <types>
        <xsd:schema targetNamespace="http://testws.localhost/album"/>
    </types>
    <portType name="SoaptestPort">
        <operation name="hello">
            <documentation>This method returns a string</documentation>
            <input message="tns:helloIn"/>
            <output message="tns:helloOut"/>
        </operation>
    </portType>
    <binding name="SoaptestBinding" type="tns:SoaptestPort">
        <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="hello">
            <soap:operation soapAction="http://testws.localhost/album#hello"/>
            <input>
                <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://testws.localhost/album"/>
            </input>
            <output>
                <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://testws.localhost/album"/>
            </output>
        </operation>
    </binding>
    <service name="SoaptestService">
        <port name="SoaptestPort" binding="tns:SoaptestBinding">
            <soap:address location="http://testws.localhost/album"/>
        </port>
    </service>
    <message name="helloIn">
        <part name="value" type="xsd:string"/>
    </message>
    <message name="helloOut">
        <part name="return" type="xsd:string"/>
    </message>
</definitions>
4

3 に答える 3

1

問題はコントローラーにあると思います。まず、あなたがし$_URIなければなりません

$_URI = "http://testws.localhost/album";

(つまり、http スキーマを使用)。

2 番目に間違った引数を に渡していますAutoDiscover。 の最初の引数はAutoDiscoverURL ではありません。handleWSDLメソッドを次のように置き換えてみてください。

private function handleWSDL() {
    $autodiscover = new AutoDiscover();
    $autodiscover->setClass('Soaptest')
                 ->setUri($this->_URI);
    $autodiscover->handle();
}
于 2013-07-12T07:36:58.757 に答える
1

Zend + Phpでこのエラーが発生します

SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://wsdl...' : failed to load external entity "http://wsdl..."

サーバーが URL にアクセスできないことが問題の原因であることがわかりました。面白いですが、Web サービスをホストしているサーバーが独自の wsdl URL を curl/wget/read できない場合に発生します。

cURL で wsdl URL を試してみて、何かを取得できるかどうかを確認してください。

于 2013-11-18T11:00:43.493 に答える
0

実際には、実際にはまったく問題がないように見えます。私が作成した ac# サンプル アプリと XMLSpy の両方が、wsdl ファイルを読み込んでサービスにリクエストを送信できます。

生成されたエラーは、私の Web ブラウザーが SOAP 要求を送信していなかったことと、wsdl ファイルを処理するために SOAP サーバーが要求からの情報をサービスの説明と照合しようとしたことが原因であると推測しています。完全に有効で使用可能な wsdl ファイルに関するエラーではなく、有効な SOAP リクエストの欠如に関するエラーが返されることを期待していました。このエラーが Zend SOAP サーバーによって作成されたものなのか、それが使用する基礎となる php SOAP サーバーによって作成されたものなのかは不明です。

したがって、他の誰かがこのエラーを表示した場合は、適切な SOAP クライアントでテストしていることを確認してください。

于 2013-07-14T04:50:58.753 に答える