Я пытаюсь вызвать службу WCF (.NET) из PHP. Это немного сложнее, чем просто использование SoapClient
, поскольку для аутентификации используется служба WS2007FederationHttpBinding
.Вызов службы WCF с PHP (с федеративной безопасностью)
Вот код, который я использую в данный момент. Я даже не добавил учетные данные, поскольку я не уверен, как, но независимо от того, я даже не в том месте, где я получаю доступ к отказам в ошибках.
$wsdl = "https://slc.centershift.com/sandbox40/StoreService.svc?wsdl";
$client = new SoapClient($wsdl,array(
//'soap_version'=>SOAP_1_2 // default 1.1, but this gives 'Uncaught SoapFault exception: [HTTP] Error Fetching http headers'
));
$params = array();
$params['SiteID'] = 123;
$params['GetPromoData'] = false;
$ret = $client->GetSiteUnitData(array('GetSiteUnitData_Request'=>$params));
print_r($ret);
Какой WSDL я должен указывать на?
https://slc.centershift.com/Sandbox40/StoreService.svc?wsdl
Кажется быть очень коротким, но включает в себя ссылку на (обратите внимание наwsdl0
)https://slc.centershift.com/Sandbox40/StoreService.svc?wsdl=wsdl0
https://slc.centershift.com/Sandbox40/StoreService.svc?singleWsdl
Кажется, есть все, что в нем.
Нужно ли указывать SOAP 1.2? Когда я это сделаю, я получаю таймаут соединения (
[HTTP] Error Fetching http headers
). Когда я этого не делаю, используется значение по умолчанию для SOAP 1.1, и я получаю[HTTP] Cannot process the message because the content type 'text/xml; charset=utf-8' was not the expected type 'application/soap+xml; charset=utf-8'
. Это потому, что я еще не аутентифицирован, или потому, что я использую неправильную версию SOAP?Как проверить подлинность на PHP? Вот соответствующий код .NET/C#. Нужно ли мне как-то ставить их как заголовки SOAP? Или я думаю о том, что все это неправильно, и мне нужно сделать некоторую аутентификацию, прежде чем я даже вызову метод (из того, что я прочитал, я должен вернуть токен, а затем использовать его для всех будущих вызовов метода - I Кажется, я вижу пример этого в an answer here on Stack Overflow.
Если я позвоню $client->__getFunctions()
, используя либо WSDL и SOAP либо версии, я получаю правильный список всех функций, поэтому я предполагаю, что любой из них и моя настоящая проблема - это аутентификация.
Другие программисты, с которыми я говорил, потратили время на то, чтобы заставить это работать, но отказались и вместо этого внедрили прокси-сервер в .N ET. Они передают свои параметры с PHP на свою незащищенную службу .NET, которая, в свою очередь, вызывает этот безопасный сервис. Он работает, но кажется безумно неэффективным для меня и контрпродуктивным, поскольку цель WCF заключается в поддержке всех типов клиентов (даже не-HTTP-файлов!).
Я прочитал How to: Create a WSFederationHttpBinding на MSDN, но это не помогло.
Либо? Wsdl или? SingleWsdl будет в порядке. Первый ссылается на несколько документов, разделенных по назначению, последний имеет все в одном месте. Wsdl указывает, что используется мыльная версия, поэтому кажется странным, что после того, как она загрузила wsdl, все равно нужно сказать, какую версию мыла использовать. Я предлагаю, чтобы библиотека была незрелой/плохой, если эта базовая информация должна быть предоставлена в дополнение к wsdl, и я бы не ожидал, что вы с ней начнете работать. Я предлагаю найти другую/лучшую библиотеку мыла. – MattC
@MattC Спасибо за комментарий. Полезно знать о WSDL, но, надеюсь, мыльная библиотека не является проблемой (это родной PHP-файл). Я проверил nuSoap, но не выглядел так, как будто он принесет какие-либо преимущества. –
Я действительно не хочу звучать snarky, @ShaneN, но встроенный в PHP не является гарантией качества. См. crappy 'mail()'. Не работали с SOAP с PHP, поэтому я не могу помочь. – Palec