“Circolare attributo di riferimento per il gruppo.”
-
25-09-2019 - |
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
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.