我有一个XmlSchema
被实例化为单例的。
public static XmlSchema MessageSchema
{
get
{
lock (MessageSchemaLock)
{
// If this property is not initialised, initialise it.
if (messageSchema == null)
{
// Read XSD from database.
string xsd = Database.Configuration.GetValue("MessageBaseXsd");
using (TextReader reader = new StringReader(xsd))
{
messageSchema = XmlSchema.Read(reader, (sender, e) => {
if (e.Severity == XmlSeverityType.Error) throw e.Exception;
});
}
}
}
// Return the property value.
return messageSchema;
}
}
private static XmlSchema messageSchema = null;
private static readonly object MessageSchemaLock = new object();
此模式用于验证进入系统的每个文档。以下方法执行验证。
/// <summary>
/// Validates the XML document against an XML schema document.
/// </summary>
/// <param name="xml">The XmlDocument to validate.</param>
/// <param name="xsd">The XmlSchema against which to validate.</param>
/// <returns>A report listing all validation warnings and errors detected by the validation.</returns>
public static XmlSchemaValidationReport Validate(XmlDocument xml, XmlSchema xsd)
{
XmlSchemaValidationReport report = new XmlSchemaValidationReport();
xml.Schemas.Add(xsd);
xml.Validate((sender, e) => { report.Add(e); });
xml.Schemas.Remove(xsd);
return report;
}
包含一个“XmlSchemaValidationReport
列表”和一些辅助方法,没有任何东西可以看到该XmlSchema
对象。
当我在多个线程上验证消息时,在Validate
处理前几条消息后该方法失败。它报告说其中一个元素丢失了,尽管我看得很清楚。我的测试是多次发送相同的消息,每次都作为单独的XmlDocument
. 我仔细检查了该MessageSchema
属性是唯一设置该messageSchema
字段的代码。
在验证期间是否以XmlSchema
某种方式被改变?为什么我的验证失败?