2011-01-05 11 views
1

Es ist wieder die komisch-seltsame Situation :)"Kreis-Attributgruppenreferenz."

Ich habe Funktion, die angegebene XML gegen XSD überprüft und löst Ausnahme, wenn die Validierung fehlschlägt. (Die Funktion wird von WebPage genannt, die die XML-Anrufe empfangen)

sowohl der Anruf

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

und die Validierung Funktion ist ziemlich einfach

/// <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; 
     } 
    } 

Und das funktionierte sehr gut für die letzten 2 Jahre, aber vor kurzem hat die Validierungsfunktion begonnen, die folgende Nachricht zurück zu senden:

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

Das ist eine falsche Nachricht - weder das XSD noch das gesendete XML haben sich geändert, außerdem wenn ich den Anwendungspool wiederverwerfe und dasselbe XML wieder sende (ich habe ein "ping" Programm, das alle paar Sekunden das gleiche XML sendet und das Ergebnis überprüft)) die Validierung besteht ... für eine Weile (einige liegen zwischen wenigen Minuten und wenigen Stunden).

Die XSD befindet sich im selben Verzeichnis wie die aufrufende Seite und im Serverprotokoll sehe ich die Anfrage an die XSD mit HTTP/200 Antwort, ich habe sogar versucht, die HTTPS zu lokalen Pfad zu ändern, aber der Fehler blieb gleich (zeigt auf ungültige Adresse gibt HTTP/404 oder ungültige Pfadausnahmen, so versucht es, die XSD-Datei zu lesen)

Wieder - recycling der Apppool löst es sofort, aber ich kann nicht alle 5 Minuten recyceln.

Vielen Dank im Voraus! Simon

+0

Ein Beispiel von Ihrem XML und dem xsd würde helfen. – Kev

+0

Was löst die Validierung aus? Wie oft passiert das? –

+0

@Kev - Beispiel für die XML und XSD ist die eine denke ich kann nicht hochladen, und doch, wie ich schrieb - sowohl die XSD und die XML sind in Ordnung - nach dem Recycling der App-Pool beide gut funktionieren. @James B - Die Validierung wird jedes Mal durchgeführt, wenn eine XML-Anfrage eingeht. 100 mal/minute – SimSimY

Antwort

1

Sie werden diese Antwort nicht mögen, aber anscheinend wurde die XmlValidatingReader in .NET 2.0 veraltet ... vielleicht wegen solcher Probleme?

Der Vorschlag ist validate using an XmlReader. Dieser Link bezieht sich auf die Version 2.0 der Hilfedateien, die einige Details enthält, die für die Konvertierung von einer XmlValidatingReader; neuere Versionen der Hilfe sind in der Drop-down-Liste oben verfügbar.

This link gibt Details über die XmlValidatingReader veraltet.

Ein Beispiel für die Verwendung eines XmlReader ist here.

+0

Entschuldigung für die Verzögerung - Sie haben Recht. Ich mag es nicht, aber du hast Recht. – SimSimY