Domanda

Il suo strano-strano situazione ancora una volta :)

Ho una funzione che verifica dato XML contro XSD e getta eccezione quando la convalida ha esito negativo.(la funzione viene chiamata dalla Pagina web che riceve i dati xml chiamate)

sia il call

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

e la convalida di funzione sono abbastanza semplici

   /// <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 questo ha funzionato molto bene per gli ultimi 2 anni, ma di recente la funzione di validazione iniziato a restituire il seguente messaggio:

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

Che è falso messaggio, né il XSD né inviato XML sono cambiati, inoltre se io riciclo il Pool di Applicazioni, e inviare lo stesso XML di nuovo (ho "ping", un programma che invia lo stesso XML ogni pochi secondi e controlla il risultato) la validazione e passa...per un po ' (alcuni, tra pochi minuti e poche ore).

XSD è seduto nella stessa directory della pagina chiamante e nel log del server vedo la richiesta al XSD con HTTP/200 risposta, ho anche provato changeing HTTPS locali di percorso, ma l'errore è rimasto lo stesso (indicando indirizzo non valido dà HTTP/404 o non valido percorso di eccezioni che non tenta di leggere il file XSD)

Di nuovo - riciclaggio apppool risolve subito, ma io non riesco a riciclare ogni 5 minuti.

Grazie in anticipo!Simon

È stato utile?

Soluzione

Non ti piace questa risposta, ma a quanto pare l' XmlValidatingReader è stato reso obsoleto in .NET 2.0...forse a causa di problemi come questo?

Il suggerimento è quello di convalida utilizzando un XmlReader.Quel link è per la versione 2.0 del file della guida, che include alcuni dettagli specifici per la conversione da un XmlValidatingReader;le versioni più recenti di aiuto sono disponibile a discesa nella parte superiore.

Questo link dettagli su il XmlValidatingReader essere obsoleti.

Un esempio di utilizzo di un XmlReader è qui.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top