2

Zend Framework 2.0 で SOAP コンポーネントを使用すると問題が発生します

コードは次のとおりです。

namespace User\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\Soap\Server;
use Zend\Soap\Client;
use Zend\Soap\AutoDiscover;
use User\Model\MyTest;

class TestController extends AbstractActionController {
private $_WSDL_URI = "http://127.0.0.1/test/index?wsdl";

private function handleWSDL() {
    $autodiscover = new AutoDiscover(); 
    //ini_set("soap.wsdl_cache_enabled", 0);
    $autodiscover->setClass('User\Model\MyTest')
                 ->setUri($this->_WSDL_URI);
    $wsdl = $autodiscover->generate();
    header("Content-type: text/xml");
    echo $wsdl->toXml();
    exit;   
}

private function handleSOAP() {
    $soap = new Server($this->_WSDL_URI,array('encoding' => 'utf-8','soap_version'=>SOAP_1_2));
    $soap->setClass('User\Model\MyTest');
    $soap->handle();
    exit;
}

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

public function clientAction(){
    $client = new Client('http://127.0.0.1/test/index?wsdl');
    $result = $client->getUser(31);
    var_dump($result);exit;
}

}

にアクセスするhttp://localhost/test/index?wsdl と、WSDL が返されます。

しかし、私がアクセスするhttp://localhost/test/indexと、エラーが返されます:

SOAP-ERROR: WSDL の解析中: からロードできませんでしたhttp://127.0.0.1/test/index?wsdl: 外部エンティティのロードに失敗しました"http://127.0.0.1/test/index?wsdl"

私が訪問するhttp://localhost/test/clientと、それは戻ってきます

An error occurred
An error occurred during execution; please try again later.
Additional information:
SoapFault
File:
E:\WWW\vendor\ZF2\library\Zend\Soap\Client.php:1087
Message:
Wrong Version

Stack trace:

 #0 E:\WWW\vendor\ZF2\library\Zend\Soap\Client.php(1087):  SoapClient->__soapCall('getUser', Array, NULL, NULL, Array)
 #1 E:\WWW\module\User\src\User\Controller\TestController.php(44): Zend\Soap\Client->__call('getUser', Array)

ここに MyTest.php ファイルがあります

namespace User\Model;

class MyTest{
/**
 * To get the register information of the user
 * 
 * @return string
 */
public function getUser(){
    return 'hello';
}
}

前もって感謝します。

4

1 に答える 1

0

SOAP サーバーを作成するには、WSDL ファイルのみが必要であり、他のクライアントにサービスを提供するために使用される URL は必要ありません。実際、これには URL を使用しない方がパフォーマンスが向上します。なぜなら、Soap サーバーへのすべての要求が WSDL をフェッチするためのサブ要求を開始するからです。

WSDL が作成されたらどこかに配置し、後続の要求でそこからフェッチするようにしてください。毎回自動検出するのは、指定されたインターフェースなしで開発を行う場合にのみ有効です。他の誰かがこのインターフェイスを使用し、その安定性に依存すると、問題が発生します。

于 2012-12-18T19:19:22.243 に答える