Циклическая ссылка на группу атрибутов.

Опять странная-странная ситуация :)

У меня есть функция, которая проверяет данный 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)

Опять же - перезапуск пула приложений решает его немедленно, но я не могу перерабатывать каждые 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