2010-07-07 5 views
0

J'essaie d'utiliser un service Web en utilisant PHP et SOAP. Le service Web est construit en .NET et hébergé sur un serveur ASP. J'utilise le code suivant pour interagir avec l'API, mais je continue d'obtenir une erreur avec l'analyse de WSDL. Le serveur PHP UNIX a un certificat SSL, l'hôte de service Web a également un certificat SSL et j'utilise https pour lancer la transaction.Service Web SOAP sur serveur ASP consommé via PHP

Cet appel API particulier demande une chaîne pour un numéro de membre:

$wsdl=' https://domain.com/ws.asmx?wsdl ';

$client=new SOAPClient($wsdl, array('exceptions'=>0));

$result=$client->IsMemberCurrent('123456789');

Erreur:

Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'domain/ws.asmx?wsdl' : Start tag expected, '<' not found in index.php on line 4 

Je peux voir le contenu WSDL mais le message d'erreur que je reçois via PHP suggère qu'il ne peut pas voir ou ne peut pas traiter le fichier WSDL?

SOAP 1.2 service description:POST /SubscriberAPI.asmx HTTP/1.1 
Host: subdomain.domain.com 
Content-Type: application/soap+xml; charset=utf-8 
Content-Length: length 

<?xml version="1.0" encoding="utf-8"?> 
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> 
    <soap12:Body> 
    <IsMemberCurrent xmlns="http://www.domain.com/"> 
     <MembershipNo>string</MembershipNo> 
    </IsMemberCurrent> 
    </soap12:Body> 
</soap12:Envelope> 

Répondre

0

Il semble que vous ne puissiez pas accéder au fichier WSDL. Vous devez donc diagnostiquer le problème.

Essayez

echo htmlentities(file_get_contents($wsdl));

Il vous donnera une meilleure idée de ce PHP obtient comme réponse.

Une fois que le SoapClient fonctionne, votre prochaine ligne de code ne fonctionnera pas comme prévu.

Vous devez placer votre paramètre dans un tableau associatif, sinon le service Web ne le reconnaîtra pas.

La réponse renvoyée par le service Web .NET sera également un objet IsMemberCurrentResponse, qui contient un IsMemberCurrentResult. Vous devez donc remplacer votre dernière ligne par la suivante.

$params = array('MembershipNo'=>'1234567890'); 
$response = $client->IsMemberCurrent($params); 
$result = $response->IsMemberCurrentResult; 
+0

Merci pour le conseil. J'ai fait comme suggéré, mais le retour que je reçois est le même - ne pouvait pas charger l'erreur. Cela pourrait-il signifier un problème de pare-feu puisque je suis capable de voir le fichier WSDL lorsque j'essaie d'y accéder directement à partir du navigateur Web? – chocolatecoco

+0

En cas d'erreur sur file_get_contents, il s'agit d'un problème de connexion à la boîte IIS et non d'un problème avec IIS ou ASP.NET. Il peut s'agir d'un problème de pare-feu, mais vous avez besoin de plus d'informations. Obtenez-vous plus d'informations que vous ne pouvez pas charger? Le navigateur Web que vous utilisez est-il situé sur le serveur UNIX? Pouvez-vous essayer sur http plutôt que sur https? –

+0

Mon serveur web utilise PHP/UNIX et j'ai essayé HTTP et HTTPS mais l'erreur que je reçois est qu'il ne peut pas analyser le fichier WSDL. Le message d'erreur que vous voyez dans mon message d'origine est toutes les informations que PHP affiche à moins qu'il n'y ait des méthodes de débogage qui peuvent être utilisées pour extraire plus d'informations? – chocolatecoco