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
、最初のいくつかのメッセージが処理された後にメソッドが失敗します。要素の 1 つが欠落していると報告されていますが、私にはそれがはっきりと見えています。私のテストでは、同じメッセージを複数回、それぞれ個別の として送信していますXmlDocument
。プロパティがフィールドMessageSchema
を設定する唯一のコードであることを再確認しました。messageSchema
XmlSchema
検証中に何らかの形で変更されていますか? 検証が失敗するのはなぜですか?