Как сделать Soap Server на PHP что бы он поддерживал стандарт ws-i?

Здравствуйте!


У меня возникла следующая проблема.


Понадобилось на портале реализовать связь между порталом и программой написанной на C#, написали SOAP сервис с использованием zend soap server и zend soap autodiscover. Но в результате C# не понимает ответ от этого сервиса потому что он не поддерживает стандарт ws-i.


Может кто то уже сталкивался с таким и нашел решение данной проблемы?


Код SOAP сервера:
if ( $wsdl !== null ) {
				    
    $autodiscover = new Zend_Soap_AutoDiscover('Zend_Soap_Wsdl_Strategy_ArrayOfTypeSequence');

    $autodiscover->setOperationBodyStyle( array ('use'=>'literal', 'namespace'=>'http://' . $hostname . '/api2/' . (is_array($this -> key) ? $this -> key['key'] : $this -> key) . '?wsdl'));

    $autodiscover->setBindingStyle(array('transport'=> 'http://schemas.xmlsoap.org/soap/http'));

    $autodiscover -> setClass('Model_Soap');
}
elseif ($request -> isPost()) {

    $server = new Zend_Soap_Server('http://' . $hostname . '/api2/' . (is_array($this -> key) ? $this -> key['key'] : $this -> key) . '?wsdl');

    $server->setClass('Model_Soap');

    $server -> handle();
}
  • Вопрос задан
  • 4159 просмотров
Решения вопроса 1
@AlexBoo Автор вопроса
Решил данную проблему добавив к модели специальный Proxy класс, который переобразует входящие и исходящие данные к серверу.

class Service_SoapProxy
{
    protected $_service;
    
    public function __construct()
    {
        $this->_service = new Model_Soap();
    }
    
    public function __call($name, $arguments)
    {
        $params = array();
	
        if(count($arguments) > 0){
	    
            foreach($arguments[0] as $property=>$value){
                $params[$property] = $value;
            }
	    
        }
	
        $result = call_user_func_array(array($this->_service, $name), $params);
	
        return array("{$name}Result" => $result);
    }
}


После этого Soap сервер стал выглядеть следующим образом:

if ( $wsdl !== null ) {	    
    $autodiscover = new Zend_Soap_AutoDiscover('Zend_Soap_Wsdl_Strategy_ArrayOfTypeSequence');
    $autodiscover->setBindingStyle(array('style'=>'document'));
    $autodiscover->setOperationBodyStyle(array('use' => 'literal'));
    $autodiscover->setClass('Model_Soap');
    $autodiscover->handle();
}
elseif ($request -> isPost()) {

    // Request soap
    if (! empty($this -> key)) {
        $wsdl = 'http://' . $hostname . '/api2/' . (is_array($this -> key) ? $this -> key['key'] : $this -> key) . '?wsdl';
    }
    else
        $wsdl = 'http://' . $hostname . '/api2/?wsdl';
					
    $server = new Zend_Soap_Server($wsdl, array('cache_wsdl'=>false));
    $modelSoap = new Service_SoapProxy();
    $server->setObject($modelSoap);
    $server->handle();
}


Правда после этих изменений php не может работать с данным SOAP сервером, работать с ним может только .NET
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы