Циркулярна препратка към група атрибути.

Отново е странна-странна ситуация :)

Имам функция, която проверява даден XML срещу XSD и хвърля изключение, когато валидирането е неуспешно. (функцията се извиква от уеб страница, която получава xml извикванията)

както обаждането

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

и функцията за валидиране са доста прости

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

И това работи много добре през последните 2 години, но наскоро функцията за валидиране започна да връща следното съобщение:

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

Което е невярно съобщение - нито XSD, нито изпратеният XML са се променили, освен това, ако рециклирам набора от приложения и изпратя същия XML отново (имам "ping" програма, която изпраща същия XML на всеки няколко секунди и проверява резултата) валидирането преминава... за известно време (някои са между няколко минути и няколко часа).

XSD се намира в същата директория като извикващата страница и в регистрационния файл на сървъра виждам заявката към XSD с HTTP/200 отговор, дори се опитах да променя HTTPS на локален път, но грешката остана същата (сочи към невалиден адрес дава HTTP/404 или изключения за невалиден път, така че се опитва да прочете XSD файла)

Отново - рециклирането на apppool го разрешава незабавно, но не мога да рециклирам на всеки 5 минути.

Благодаря предварително! Саймън


person SimSimY    schedule 05.01.2011    source източник
comment
Извадка от вашите xml и xsd би помогнала.   -  person Kev    schedule 05.01.2011
comment
Какво задейства валидирането? Колко често се случва това?   -  person James King    schedule 05.01.2011
comment
@Kev - Пример за XML и XSD е този, който мисля, че не мога да кача, но въпреки това, както написах - и XSD, и XML са добре - след рециклиране на пула от приложения и двата работят добре. @James B - Валидирането се извършва при всяко получаване на XML заявка, приблизително. 100 пъти/минута   -  person SimSimY    schedule 06.01.2011
comment
Обмисляйки го... можете ли да публикувате кода за обратно извикване?   -  person James King    schedule 06.01.2011


Отговори (1)


Няма да ви хареса този отговор, но очевидно XmlValidatingReader е остарял в .NET 2.0... може би поради проблеми като този?

Предложението е да валидирате с помощта на XmlReader. Тази връзка е за версия 2.0 на помощните файлове, която включва някои подробности, специфични за конвертиране от XmlValidatingReader; по-новите версии на помощта са достъпни от падащото меню в горната част.

Тази връзка дава подробности за XmlValidatingReader остарели.

Пример за използване на XmlReader е тук.

person James King    schedule 06.01.2011
comment
Извинете за забавянето - прав сте. Не ми харесва, но си прав. - person SimSimY; 07.09.2011