Pergunta

É a situação estranha mais uma vez :)

Eu funcionei que verifica o XML em relação ao XSD e lança exceção quando a validação falha. (A função é chamada da página da web que recebe as chamadas XML)

Ambos a chamada

if (!xmlvld.ValidXmlDoc(X, "", "https://somepathtofile.xsd")) 
    throw new Exception(xmlvld.ValidationError + "1");

e a função de validação é bem simples

   /// <summary>
    /// This method validates an xml string against an xml schema.
    /// </summary>
    /// <param name="xml">StringReader containing xml</param>
    /// <param name="schemaNamespace">XML Schema Namespace</param>
    /// <param name="schemaUri">XML Schema Uri</param>
    /// <returns>bool</returns>
    public bool ValidXmlDoc(StringReader xml, string schemaNamespace, string schemaUri)
    {
        // Continue?
        if (xml == null || schemaNamespace == null || schemaUri == null)
        {
            return false;
        }

        isValidXml = true;
        XmlValidatingReader vr;
        XmlTextReader tr;
        XmlSchemaCollection schemaCol = new XmlSchemaCollection();
        schemaCol.Add(schemaNamespace, schemaUri);

        try
        {
            // Read the xml.
            tr = new XmlTextReader(xml);
            // Create the validator.
            vr = new XmlValidatingReader(tr);
            // Set the validation tyep.
            vr.ValidationType = ValidationType.Auto;
            // Add the schema.
            if (schemaCol != null)
            {
                vr.Schemas.Add(schemaCol);
            }
            // Set the validation event handler.
            vr.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
            // Read the xml schema.
            while (vr.Read())
            {
            }

            vr.Close();

            return isValidXml;
        }
        catch (Exception ex)
        {
            this.ValidationError = ex.Message;
            return false;
        }
        finally
        {
            // Clean up...
            vr = null;
            tr = null;
        }
    }

E isso funcionou muito bem nos últimos 2 anos, mas recentemente a função de validação começou a devolver a mensagem seguinte:

[ValidationError]Circular attribute group reference.[/ValidationError]

Que é uma mensagem falsa - nem o XSD nem o XML enviado mudaram, além disso, se eu reciclar o pool de aplicativos e enviar o mesmo XML novamente (o programa "ping" que envia o mesmo XML a cada poucos segundos e verifica o resultado) A validação passa ... por um tempo (alguns estão entre alguns minutos e poucas horas).

O XSD está no mesmo diretório da página de chamada e, no log do servidor, vejo a solicitação ao XSD com resposta HTTP/200, até tentei alterar os HTTPs para o caminho local, mas o erro permaneceu o mesmo (apontando para o endereço inválido fornece exceções HTTP/404 ou caminho inválido para que ele tenta ler o arquivo XSD)

Novamente - a reciclagem do AppPool resolve -o imediatamente, mas não consigo reciclar a cada 5 minutos.

Desde já, obrigado! Simon

Foi útil?

Solução

Você não vai gostar desta resposta, mas aparentemente o XmlValidatingReader estava obsoleto no .NET 2.0 ... talvez por causa de questões como essa?

A sugestão é Validar usando um XmlReader. Esse link é para a versão 2.0 dos arquivos de ajuda, que incluem alguns detalhes específicos para converter de um XmlValidatingReader; Versões mais recentes da ajuda estão disponíveis no suspensão no topo.

Esse link dá detalhes sobre o XmlValidatingReader sendo obsoleto.

Um exemplo de usar um XmlReader é aqui.

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