Question

Ces derniers temps, nous avons été voir des exceptions comme celle-ci dans notre .NET (.asmx) webservices:

System.Web.Services.Protocols.SoapException: Server was unable to read request. ---> System.InvalidOperationException: There is an error in XML document (868, -3932). ---> System.Xml.XmlException: '.', hexadecimal value 0x00, is an invalid character. Line 868, position -3932.
   at System.Xml.XmlTextReaderImpl.Throw(Exception e)
   at System.Xml.XmlTextReaderImpl.Throw(String res, String[] args)
   at System.Xml.XmlTextReaderImpl.Throw(Int32 pos, String res, String[] args)
   at System.Xml.XmlTextReaderImpl.ThrowInvalidChar(Int32 pos, Char invChar)
   at System.Xml.XmlTextReaderImpl.ParseNumericCharRefInline(Int32 startPos, Boolean expand, BufferBuilder internalSubsetBuilder, Int32& charCount, EntityType& entityType)
   at System.Xml.XmlTextReaderImpl.ParseText(Int32& startPos, Int32& endPos, Int32& outOrChars)
   at System.Xml.XmlTextReaderImpl.ParseText()
   at System.Xml.XmlTextReaderImpl.ParseElementContent()
   at System.Xml.XmlTextReaderImpl.Read()
   at System.Xml.XmlTextReader.Read()
   at System.Web.Services.Protocols.SoapServerProtocol.SoapEnvelopeReader.Read()
   at System.Xml.XmlReader.ReadElementString()
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReader1.Read14_SendErrlog()
   at Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer12.Deserialize(XmlSerializationReader reader)
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
   --- End of inner exception stack trace ---
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle)
   at System.Web.Services.Protocols.SoapServerProtocol.ReadParameters()
   --- End of inner exception stack trace ---
   at System.Web.Services.Protocols.SoapServerProtocol.ReadParameters()
   at System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()

Comment puis-je déboguer cette exception? Cette exception est se nous a rapporté d'un filtre SOAP qui cherche des exceptions dans message.Stage = SoapMessageStage.AfterSerialize.

Est-il possible d'obtenir à la demande de savon d'origine? Comment puis-je obtenir un caractère non valide à la ligne 868, colonne -3932? Comment peut-il un négatif colonne 3932?

Était-ce utile?

La solution

Ceci est l'une des choses irritantes sur l'approche des services Web Microsoft - si la demande ne peut pas être désérialisé dans les objets de votre signature de la méthode web, alors le consommateur de service reçoit un message cryptique. Et pour couronner le tout, la demande ne fait jamais dans votre service Web, car il ne peut pas être deserialzied de sorte que vous ne pouvez pas gérer correctement l'erreur.

Qu'est-ce que je ferais pour aider à ce genre de problèmes est de créer une nouvelle SoapExtension qui vous permet de sortir le XML brut vers une destination qui vous convient simplement (fichier ou trace pour être lu par DebugView ou tout ce que vous aimez ). Le code irait à l'étape BeforeDeserialize. Vous pouvez activer la SoapExtension via web.config dans le cas où vous vouliez enquêter sur une de ces questions. L'inconvénient d'utiliser le web.config pour ajouter le SoapExtension est qu'il sera actif pour l'ensemble de l'application Web. Vous pouvez ajouter une configuration personnalisée supplémentaire qui permettrait à votre service de se connecter uniquement des informations pour un paramètre spécifique ou une méthode Web spécifique si vous voulez.

En général, juste en voyant le XML entrant, vous pouvez voir ce que le problème est. Sinon, vous pourriez essayer d'exécuter manuellement le XML capturé par petit programme qui appelle le sérialiseur XML et voyez si vous pouvez savoir ce qui se passe. Un autre outil utile est service Web Studio 2 qui est un harnais de test qui vous permet de saisir des données et invoquez votre service (et soumettre également une XML que vous voulez).

En ce qui concerne votre question spécifique, voici mon / deviner. Il ressemble à nul caractère ASCII est codé obtenir et envoyé à votre service qui est invalide selon le Spec XML. La réponse est simple: ne pas envoyer ce caractère. Mais qui envoie ce personnage? Est-ce un client .NET? Avez-vous un contrôle sur le client? Si vous avez besoin de travailler autour du bug de quelqu'un d'autre, alors vous devrez peut-être remplacer le caractère fautif (s) avec un autre personnage (chaîne peut-être vide).

Autres conseils

Vous devriez être en mesure d'obtenir le message d'origine en utilisant un autre SoapExtension. En fait, la même extension pourrait probablement être modifié pour faire une copie de l'entrée, et pour le supprimer s'il ne fait pas exception. L'entrée originale serait alors disponible pour vous si une exception est survenue.

Vous pouvez également utiliser un outil externe comme Fiddler pour regarder ce qui est envoyé.

Pour votre information:. SoapException.Message est laissée intentionnellement vague pour éviter d'exposer trop d'informations qui pourraient être utilisées pour exploiter le système

Pour votre cas particulier, je prendrais les conseils de John et installer Fiddler pour surveiller le trafic HTTP réel et afficher le message sur le fil.

La partie de votre exception qui me saute aux yeux est la « valeur hexadécimale 0x00, est un caractère non valide », mais comme vous l'avez mentionné le numéro de ligne il pointe est superposé -. Il est donc rien de concret

Quel genre de paramètres vous passez au service? Est-ce que vous faites tout type de codage personnalisé avec une extension SOAP? Tous les en-têtes SOAP supplémentaires ajoutés?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top