Я пытаюсь вызвать службу WCF (.NET) из PHP. Это немного сложнее, чем просто использовать SoapClient
, поскольку служба использует WS2007FederationHttpBinding
для аутентификации.
Вот код, который я использую в данный момент. Я даже не добавил учетные данные, поскольку я не уверен, как, но независимо, я даже не в том месте, где я получаю доступ к отказам в ошибках.
$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/С#. Нужно ли мне как-то ставить их как заголовки SOAP? Или я думаю о том, что все это неправильно, и мне нужно сделать некоторую аутентификацию, прежде чем я даже вызову метод (из того, что я прочитал, я должен был получить токен назад, а затем использовать его для всех будущих вызовов метода - я думаю, что я см. пример этого в ответе здесь о переполнении стека.
Если я вызываю $client->__getFunctions()
, используя либо WSDL, либо SOAP-версию, Im получает список всех функций, поэтому я предполагаю, что это одно из них, и моя настоящая проблема - это аутентификация.
Другие программисты, с которыми я говорил, потратили время, пытаясь заставить это работать, но отказались и вместо этого внедрили прокси в .NET. Они передают свои параметры с PHP на свою незащищенную службу .NET, которая, в свою очередь, вызывает этот безопасный сервис. Он работает, но кажется безумно неэффективным для меня и контрпродуктивным, поскольку цель WCF заключается в поддержке всех типов клиентов (даже не-HTTP-протоколов!).
Я прочитал Как создать WSFederationHttpBinding в MSDN, но он не помог.