Frage

In letzter Zeit haben wir solche Ausnahmen in unseren .NET -Webservices (asmx) gesehen:

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()

Wie kann ich diese Ausnahme debuggen? Diese Ausnahme wird uns von einem Seifenfilter gemeldet, der nach Ausnahmen in der Nachricht sucht.

Gibt es eine Möglichkeit, auf die ursprüngliche SOAP -Anfrage zu kommen? Wie bekomme ich ein ungültiges Zeichen in Zeile 868, Spalte -3932? Wie kann es a Negativ Spalte 3932?

War es hilfreich?

Lösung

Dies ist eines der irritierenden Dinge über den Microsoft Web Services -Ansatz. Wenn die Anfrage nicht in die Objekte in Ihrer Webmethode -Signatur des Dienstes deserialisiert werden kann, erhält der Dienstverbraucher eine kryptische Nachricht. Und um das Ganze abzurunden, schafft es die Anfrage nie in Ihren Webdienst, da sie nicht deserialziert werden kann, sodass Sie den Fehler nicht anmutig bewältigen können.

Was ich tun würde, um diese Art von Themen zu unterstützen, ist die Erstellung einer neuen Soapextsion, mit der Sie einfach das RAW XML an ein Ziel ausgeben können, das für Sie bequem ist (Datei oder Trace, die von Debugview oder was auch immer Sie sonst noch mögen). Der Code würde in der Bearedeserialize -Phase gehen. Sie können die Soapextsion über Web.config aktivieren, falls Sie eines dieser Probleme untersuchen möchten. Der Nachteil der Verwendung des Web.config zum Hinzufügen der Soapextsion ist, dass sie für die gesamte Webanwendung aktiv ist. Sie können eine zusätzliche benutzerdefinierte Konfiguration hinzufügen, mit der Ihr Dienst nur Informationen für einen bestimmten Endpunkt oder eine bestimmte Webmethode protokolliert, wenn Sie dies wünschen.

Normalerweise können Sie nur durch das ankommende XML sehen, was das Problem ist. Wenn nicht, können Sie versuchen, das erfasste XML manuell durch ein kleines Programm zu führen, das den XML -Serializer aufruft und feststellen kann, was Sie herausfinden können. Ein weiteres nützliches Werkzeug ist Web Service Studio 2 Dies ist ein Testkabelbaum, mit dem Sie Daten eingeben und Ihren Dienst aufrufen (und auch alle gewünschten XMLs einreichen).

In Bezug auf Ihr spezifisches Problem ist hier meine Einstellung/Vermutung. Es sieht so aus, als würde ASCII -Charakter Null codiert und an Ihren Dienst gesendet, der gemäß der XML -Spezifikation ungültig ist. Die einfache Antwort ist nicht, diesen Charakter zu senden. Aber wer sendet diesen Charakter? Ist es ein .net -Client? Haben Sie die Kontrolle über den Kunden? Wenn Sie mit dem Fehler eines anderen Menschen umgehen müssen, müssen Sie möglicherweise die beleidigenden Zeichen durch ein anderes Zeichen (möglicherweise leere Zeichenfolge) ersetzen.

Andere Tipps

Sie sollten in der Lage sein, die ursprüngliche Nachricht mit einer anderen Soapextsion zu erhalten. Tatsächlich könnte dieselbe Erweiterung wahrscheinlich geändert werden, um eine Kopie der Eingabe zu erstellen und sie zu verwerfen, wenn es keine Ausnahme gibt. Die ursprüngliche Eingabe würde Ihnen dann zur Verfügung stehen, wenn eine Ausnahme aufgetreten wäre.

Sie können auch ein externes Tool wie Geiger verwenden, um zu sehen, was Ihnen gesendet wird.

Zu Ihrer Information: Soapexception.Message wird absichtlich vage gelassen, um zu verhindern, dass zu viele Informationen aufgedeckt werden, die möglicherweise zur Nutzung des Systems verwendet werden können.

Für Ihren speziellen Fall würde ich Johns Rat einnehmen und Fiddler installieren, um den tatsächlichen HTTP -Verkehr zu überwachen und die Nachricht auf dem Kabel anzuzeigen.

Der Teil Ihrer Ausnahme, der auf mich herausspringt, ist der "Hexadezimalwert 0x00, ein ungültiges Zeichen", aber wie Sie erwähnt haben, ist die Zeilennummer, auf die er verweist, bis zu Bija-es ist also nichts Beton.

Welche Art von Parametern übergeben Sie an den Dienst? Machen Sie eine benutzerdefinierte Codierung mit einer Seifenerweiterung? Gibt es zusätzliche Seifenkopfzeile hinzu?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top