У меня есть веб-сервис WCF, который позволяет использовать как базовые HTTP, так и WS-HTTP-клиенты, как по HTTPS, используя имя пользователя, так и аутентификацию пароля. Это достигается с помощью двух привязок в одной службе.
Таким образом, служба находится на https://foo.com/Service.svc , конечной точкой Basic HTTP (SOAP 1.1) является https://foo.com/Service.svc/Unp11 , а WS-HTTP (SOAP 1.2) Конечная точка – https://foo.com/Service.svc/Unp .
Клиент пытается получить доступ к этому веб-сервису через PHP 5, используя встроенную поддержку SOAP, и у него возникают проблемы с подключением к службе. Он продолжает получать ответ HTTP 400 (Bad Request), который имеет тенденцию возникать, если сообщение SOAP плохо сформировано, или сообщение SOAP 1.1 отправляется в конечную точку SOAP 1.2 (или наоборот).
Я знаю только базовый PHP, поэтому у меня возникают проблемы с его помощью. Я знаю, что вы можете создать клиента,
$client = new SoapClient('https://foo.com/Service.svc?wsdl');
но как вы определяете привязку / конечную точку? Есть ли какие-либо известные проблемы, связанные с PHP?
ОБНОВИТЬ
Итак, я могу использовать PHP для подключения к службе WCF в порядке (с указанием версии SOAP в конструкторе SoapClient
), а вызов $client->__getFunctions()
возвращает правильный список всех операций веб-сервиса.
Когда я пытаюсь вызвать его с помощью $client->__soapCall
, страница просто сидит там в течение довольно $client->__soapCall
времени и в конечном итоге возвращает ошибку « Ошибка получения заголовков HTTP ». Что именно это подразумевает и как я могу это исправить? (Потребление сервиса от клиента .Net работает отлично.)
Просто наткнулся на это сегодня, создав WCF с несколькими привязками для вызывающего PHP. Настройка местоположения позволяет разрешить как WSDL-версию PHP SoapClient, так и указание привязки для использования.
Конфигурация WCF (1 сервис с 2 привязками wsHttp и basicHttp), довольно прямой.
PHP-код:
$client = new SoapClient("http://example.com/service.svc?wsdl"); $client->__setLocation("http://example.com/service.svc/basic"); $response = $client->MethodName(array( "paramName" => "paramValue" ... ));
У нас есть служба SOAP, которая имеет несколько привязок. В C #, когда вы добавляете ссылку на службу в wsdl, вы получаете класс, созданный для каждого из них, но в PHP кажется, что вы не можете указать, какую привязку вы хотите использовать, – это вызвало у меня проблемы, когда привязки имеют конфликтный тип / метод имена. Кажется, что он вообще работает нормально, но я действительно не знаю, как он имеет дело с ним внутри.
Другая общая проблема, с которой я столкнулся, заключается в том, что мне всегда приходится завершать параметры в массивах или структурах – иногда вы возвращаете неверный запрос, если сервер ожидает параметр, и вы не совсем правильно его установили. (см. Проблема с тем, что я пытаюсь разобраться с SOAP в PHP )
Не уверен, что это большая помощь, просто некоторые мысли. Есть также некоторые сторонние реализации Soap-клиента, написанные на PHP, на которые стоит обратить внимание, но они будут намного медленнее.