Invoquer le service WCF avec PHP (avec la sécurité fédérée)

j'essaie d'invoquer un service WCF (.NET) de PHP. C'est un peu plus compliqué que d'utiliser un SoapClient puisque le service utilise un WS2007FederationHttpBinding pour s'authentifier.

voici le code que j'utilise en ce moment. Je n'ai même pas ajouté de justificatifs d'identité car je ne sais pas comment, mais quoi qu'il en soit, je ne suis même pas au point où on me refuse l'accès à des erreurs.

$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);
  1. quel WSDL devrais-je pointer ?

  2. dois-je préciser SOAP 1.2? Quand je le fais, j'obtiens un temps d'arrêt de connexion ([HTTP] Error Fetching http headers). Quand je ne le fais pas, la valeur par défaut de SOAP 1.1 est utilisée et j'obtiens un [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'. Est-ce parce que je ne suis pas encore authentifié, ou parce que j'utilise le mauvais savon la version?

  3. comment s'authentifier en PHP? Voici le code .NET/c# correspondant. Est-ce que j'ai besoin de les mettre comme des en-têtes de savon? Ou est – ce que j'y pense mal, et j'ai besoin de faire une sorte d'authentification avant même d'appeler la méthode (d'après ce que j'ai lu, je suis censé récupérer un jeton et l'utiliser ensuite pour tous les appels de méthode futurs-je pense que je vois un exemple de cela dans réponse ici sur Pile Débordement.

Si j'appelle $client->__getFunctions(), en utilisant soit la version WSDL, soit la version SOAP, j'obtiens une liste valide de toutes les fonctions, donc je suppose que l'une ou l'autre est correcte et mon vrai problème est l'authentification.

D'autres programmeurs à qui j'ai parlé ont passé du temps à essayer de faire fonctionner ceci, mais ont abandonné et ont au lieu de cela implémenté un proxy .NET. Ils passent leurs paramètres de PHP à leur propre service non sécurisé., qui à son tour appelle ce service sécurisé. Cela fonctionne, mais me semble incroyablement inefficace, et contre-productif, car le but de la WCF est de soutenir tous les types de clients (même ceux qui ne sont pas HTTP!).

j'ai lu comment créer un WSFederationHttpBinding sur MSDN, mais ça n'a pas aidé.

19
demandé sur Community 2015-10-01 19:52:06

3 réponses

avoir travaillé avec Consumer .NET WS de PHP avant que je ne crois que vous auriez besoin de créer des objets à partir de classes en PHP qui correspondent aux noms que .NET attend. La WSDL devrait vous indiquer les types qu'elle attend. J'espère que cela aidera à faire votre chemin vers l'avant!

1
répondu Brad Thomas 2017-06-14 05:15:12