1

又是奇怪的情况:)

我有一个函数可以根据 XSD 验证给定的 XML,并在验证失败时抛出异常。(该函数从接收 xml 调用的 WebPage 调用)

既通话

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 分钟回收一次。

提前致谢!西蒙

4

1 回答 1

1

你不会喜欢这个答案,但显然XmlValidatingReader.NET 2.0 中已经过时了......也许是因为这样的问题?

建议是使用XmlReader. 该链接适用于 2.0 版本的帮助文件,其中包括一些特定于从XmlValidatingReader;转换的详细信息。更新版本的帮助可从顶部的下拉列表中获得。

此链接提供有关XmlValidatingReader已过时的详细信息。

使用 an 的示例XmlReader这里

于 2011-01-06T17:13:29.600 回答