Pergunta

Ultimamente, temos visto exceções como essa em nossos serviços da web .NET (.ASMX):

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

Como posso depurar esta exceção? Esta exceção está sendo relatada a nós de um filtro de sabão que procura exceções no message.STAGE = SOAPMESSAGESTAGE.AFTERSERILIZE.

Existe alguma maneira de obter a solicitação de sabão original? Como faço para obter um caractere inválido na linha 868, coluna -3932? Como pode haver um negativo coluna 3932?

Foi útil?

Solução

Essa é uma das coisas irritantes sobre a abordagem da Microsoft Web Services - se a solicitação não puder ser desapontada nos objetos na assinatura do seu método da Web, o consumidor de serviço recebe uma mensagem enigmática. E, para completar, a solicitação nunca entra em seu serviço da web, pois não pode ser merecida, para que você não possa lidar com o erro graciosamente.

O que eu faria para ajudar com esses tipos de problemas é criar uma nova SOAPEXTENSÃO que simplesmente permite que você produz o XML bruto para um destino que é conveniente para você (arquivo ou rastreamento a ser lido por DebugView ou o que mais quiser). O código seria para o estágio de melhoria. Você pode ativar a SOAPEXTENSÃO via web.config no caso de desejar investigar um desses problemas. A desvantagem do uso do web.config para adicionar a Soapextension é que ele estará ativo para todo o aplicativo da Web. Você pode adicionar uma configuração personalizada adicional que permitiria que seu serviço apenas registrasse informações para um terminal específico ou um método Web específico, se desejar.

Geralmente, apenas vendo o XML de entrada, você pode ver qual é o problema. Caso contrário, você pode tentar executar manualmente o XML capturado por um pequeno programa que chama o serializador XML e ver se você pode descobrir o que está acontecendo. Outra ferramenta útil é Web Service Studio 2 que é um chicote de teste que permite inserir dados e invocar seu serviço (e também enviar qualquer XML que desejar).

Em termos de seu problema específico, aqui está minha opinião/palpite. Parece que o personagem ASCII NULL está sendo codificado e enviado ao seu serviço, que é inválido de acordo com a especificação XML. A resposta simples não é enviar esse personagem. Mas quem está enviando esse personagem? É um cliente .NET? Você tem controle sobre o cliente? Se você precisar contornar o bug de outra pessoa, pode ser necessário substituir o (s) personagem (s) ofensivo (s) por outro personagem (talvez uma string vazia).

Outras dicas

Você poderá obter a mensagem original usando outra SOAPEXTENSÃO. De fato, a mesma extensão provavelmente poderia ser modificada para fazer uma cópia da entrada e descartá -la se não houver exceção. A entrada original estaria disponível para você se ocorresse uma exceção.

Você também pode usar uma ferramenta externa como o Fiddler para assistir o que está sendo enviado a você.

FYI: SoapException.Message é intencionalmente deixado vago para evitar a exposição de muitas informações que podem ser usadas para explorar o sistema.

Para o seu caso específico, seguiria o conselho de John e instalaria o Fiddler para monitorar o tráfego HTTP real e visualizar a mensagem no fio.

A parte de sua exceção que salta para mim é o "valor hexadecimal 0x00, é um personagem inválido", mas como você mencionou o número da linha que aponta é beliche-então não é nada concreto.

Que tipo de parâmetros você passa para o serviço? Você está fazendo algum tipo de codificação personalizada com uma extensão de sabão? Algum cabeçalho de sabão adicional sendo adicionado?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top