2010-11-15 5 views
2

J'essaie d'utiliser Zend_Soap_Client pour communiquer avec un service Web ASP.net. Voici mon appel client:Erreur Zend_Soap_Client appelant le service Web ASP.net: '... non défini sur une instance d'un objet'

$client = new Zend_Soap_Client(null, array(
    'location' => 'http://example.com/service.asmx', 
    'uri' => 'http://example.com/' 
)); 

$user = new UserDetail(); 
$result = $client->UserDetails($user); 

Cependant, cela me donne toujours l'erreur:

System.NullReferenceException: Object reference not set to an instance of an object. at Service.UserDetails(UserDetail UserDetail)

googling a révélé que ce problème est assez commun. La solution la plus commune semblait être de transmettre les paramètres comme un tableau, donc j'ai essayé:

$result = $client->UserDetails(array('UserDetail' => $user)); 

mais cela a donné la même erreur. J'ai également essayé de passer les params comme un objet stdClass, en imbriquant le tableau dans un autre avec 'params' comme clé, et quelques autres choses mais l'erreur est toujours la même.

J'ai le code ASP pour le service Web lui-même, la méthode pertinente est la suivante:

public Result UserDetails(UserDetail UserDetail) { 

    [some stuff] 

    Hashtable ht = new Hashtable(); 
    ht = UserDetail.GenerateData(); 
} 

l'erreur est causée par l'appel GenerateData().

Je suppose que la méthode UserDetails obtient null à la place de mon objet en tant que paramètre, mais je ne suis pas sûr comment je devrais appeler la méthode, ou comment je peux déboguer cela plus loin. La majorité des exemples Zend_Soap_Client que j'ai trouvés semblent utiliser WSDL, ce que ce service n'est pas; Je ne sais pas si c'est pertinent. Toute aide appréciée!

Répondre

2

J'ai finalement résolu cela avec:

$userDetails = new UserDetails(); 
$userDetails->UserDetail = $user; 

$client->UserDetails($userDetails); 

il semble ASP.net attend (et retours) params être imbriqué dans un objet/tableau avec le même nom que la méthode appelée.

0

Si vous avez la possibilité de changer le code asp.net, je vous suggère d'essayer une implémentation de la méthode UserDetails sans paramètres juste pour vous assurer que le code n'est pas cassé.

Je créerais alors une méthode consommateur dans asp.net, débuguerais la requête http et verrait comment l'objet userdetail est sérialisé/décomposé sous forme de tableau. Ensuite, il suffit de créer une requête HTTP similaire à partir de php.

+0

Je sais que le code ASP fonctionne car le service Web est en ligne et en cours d'utilisation. J'espérais éviter d'avoir à créer mon propre client .net pour le déboguer puisque je n'ai pas d'environnement de développement ASP, donc je considérerai cela comme mon dernier recours! –

Questions connexes