Отладка вызова SOAP PHP

Я новичок в SOAP и занимаюсь веб-службой, где, казалось бы, никто раньше не взаимодействовал с PHP. У них нет кода примера, кроме C #, но у меня есть это. eServices.asmx предоставляет WSDL, если это правильный способ сказать это.

Ошибка, которую я получаю, – «Сервер не распознал значение HTTP-заголовка SOAPAction:« с этим тренировочным двоеточием, предполагающим, что значение не передано, может быть.

Мой код выглядит так:

$URL = "http://nolaflash.example.com/xxxWS/eServices.asmx"; $namespace="http://www.example.com/webservices/"; include("SOAP/Client.php"); $soapclient = new SOAP_Client($URL); $xml_data = // valid XML is here; $res = $soapclient->UpdateData('usrname','pass',$xml_data); 

но я также пробовал:

 $param = array('usrname','pass',$xml_data); $res = $soapclient->call('UpdateData',$param, $namespace); 

Googling предполагает, что эта ошибка является проблемой пространства имен. Код C #, который у меня есть, имеет только одну ссылку на пространство имен:

 [System.Web.Services.WebServiceBindingAttribute(Name="eServicesSoap", Namespace="http://www.example.com/webservices/")] 

Если я выгружаю $ soapclient на экран перед вызовом функции, я вижу, что он получил данные из eServices.asmx.

Я не уверен, как отлаживать это, а сотрудники службы не знакомы с взаимодействием с сервисом вне их. NET IDE.

Есть предположения? Совет?

Обычно я использую getFunctions: http://www.php.net/manual/en/soapclient.getfunctions.php и getLastRequest: http://www.php.net/manual/en/soapclient.getlastrequest.php, чтобы помочь мне сортировать вещи. Сначала я просматриваю список функций и WSDL. Иногда WSDL и / или сервер неправильно настроены / настроены / закодированы. Поэтому этот список функций может оказаться бесполезным. Файл WSDL должен быть окончательным, но, увы, хромовыми кодировщиками и т. Д. …

Поэтому иногда мне приходится наносить удар в темноте, смотреть на ошибку, а затем смотреть на последний запрос. С этим вы можете увидеть фактический XML, который был создан. Сравните это с некоторыми рабочими XML-примерами.

Это оказалось наиболее полезным при работе с кодировщиками, которые не хотят писать документы. Кстати, они должны предоставить примеры XML – не показывать, как создавать XML с использованием языка XYZ. Здесь может быть более полезная информация: http://php.net/manual/en/book.soap.php

НТН

для отладки вы можете использовать веб-отладчик Fiddler. Я нашел это весьма полезным. В эти дни я работаю над проектом, основанным на веб-сервисах .net, и я должен использовать их через PHP. Это рабочий (и очень простой) код. Надеюсь, это может вам помочь. Цель этого фрагмента кода – проверить статус на определенной записи.

Это wsdl

 POST /b1synccontext.asmx HTTP/1.1 Host: 00.00.00.0 Content-Type: text/xml; charset=utf-8 Content-Length: length SOAPAction: "http://tempuri.org/QueueEntryGetStatus" <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <QueueEntryGetStatus xmlns="http://tempuri.org/"> <BuffID>int</BuffID> </QueueEntryGetStatus> </soap:Body> </soap:Envelope> HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: length <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <QueueEntryGetStatusResponse xmlns="http://tempuri.org/"> <QueueEntryGetStatusResult>int</QueueEntryGetStatusResult> </QueueEntryGetStatusResponse> </soap:Body> </soap:Envelope> 

Это код php

 $client = new SoapClient("http://YOURIP/yourservice.asmx?wsdl",array( 'exceptions'=>true, 'cache_wsdl'=>WSDL_CACHE_NONE, 'encoding'=>'utf-8')); $params = array( 'BuffID' => 134 ); try { $result = $client->QueueEntryGetStatus($params); $status = $result->QueueEntryGetStatusResult; /*do something*/ } catch (Exception $e) { $e -> getMessage(); /*do something*/ }