Использование PHP для вызова веб-службы WCF с несколькими привязками

У меня есть веб-сервис 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, на которые стоит обратить внимание, но они будут намного медленнее.