web-dev-qa-db-fra.com

Erreur Soap: «Le serveur n'a pas pu traiter la demande» «La référence d'objet n'est pas définie sur une instance d'un objet»

Lorsque j'envoie une demande SOAP à mon service dans le IIS localement, tout fonctionne bien. Lorsque j'envoie une SOAP demande au même service que celui exécuté sur IIS sur un autre hôte, tout fonctionne bien.

Mais lorsqu'un autre programmeur envoie une demande SOAP à mon service, il obtient généralement la bonne réponse, à l'exception d'une méthode du service qui renvoie:

<soap:Body>
<soap:Fault>
  <faultcode>soap:Server</faultcode>
  <faultstring>Server was unable to process request. ---&gt; Object reference not set to an instance of an object.</faultstring>
  <detail />
</soap:Fault>

J'ai besoin de comprendre pourquoi il reçoit cette erreur.

Sa requête SOAP est exactement la même que SOAP Request pourtant la mienne fonctionne et la sienne ne fonctionne pas).

14
Rodniko

Merci les gars pour votre aide. J'ai résolu le problème.

Le champ "SoapAction" dans la demande de savon avait le mauvais URI

Je recommande d'utiliser un renifleur HTTP. Le sniffer http affichera les propriétés SOAP.

La propriété "SOAPAction" devrait avoir quelque chose comme: http://tempuri.org/YourServiceMethodName

7
Rodniko

L'erreur "Référence d'objet" est la plus difficile à dépanner si vous ne savez pas exactement où l'erreur se produit. Assurez-vous de tester les valeurs nulles, car la cause la plus évidente de cette erreur est un objet qui n'est pas initialisé ou une variable ayant une valeur nulle lorsqu'il est censé contenir un objet ou une valeur.

Assurez-vous également que vous suivez les meilleures pratiques de gestion des erreurs. Essayez de détecter les erreurs le plus tôt possible, sauf si vous avez l'intention de laisser intentionnellement un gestionnaire d'erreurs de niveau supérieur intercepter l'erreur. Le fait que vous obteniez cette erreur signifie que la gestion des erreurs n'est pas suffisante.

Enfin, je recommande fortement d'inclure une sorte de mécanisme de journalisation pour vos gestionnaires d'erreurs. Enregistrez les erreurs dans le journal des événements ou dans une base de données, ou même envoyez-les par courrier électronique - n'importe quoi, afin que vous puissiez dire exactement où se trouve l'erreur. N'affichez PAS l'erreur à l'utilisateur .

Il existe plusieurs options pour cela. Asp.Net Health Monitoring fonctionne bien dans les services Web ainsi que sur les sites asp.net standard. Il y a aussi ELMAH , ou vous pouvez écrire votre propre code pour ce faire.

Si vous suivez ces instructions, vous ne serez pas dans une situation où vous ne comprendrez pas comment l'erreur se produit. Vous aurez les informations dont vous avez besoin pour résoudre correctement les problèmes et vos applications seront plus solides.

6
David