通常は何百回も実行されるコードが突然動作しなくなったという紛らわしいケースがあります。通常は数週間実行されるアプリケーションです。
問題は、XmlSerializer(Type)
破損する可能性のあるキャッシュがどこかにあるかということです。
背景:
ある時、起動時に多くの例外が発生しました。問題が検出されたときに再起動した後(数日後)、正常に動作しました。
問題を次のコードまで追跡しました。
internal static class StateManager
{
private static XmlSerializer queueSerializer = new XmlSerializer(typeof(List<QueueItem>));
private static readonly string queuePath = Path.Combine(SubSystem.PersistentDirectory, "Queue.xml");
internal static void SaveQueue(List<QueueItem> upcomingTasks)
{
XmlWriter xmlWriter = XmlWriter.Create(queuePath, xmlSettings);
queueSerializer.Serialize(xmlWriter, upcomingTasks);
xmlWriter.Close();
}
internal static List<QueueItem> GetQueue()
{
var queue = new List<QueueItem>();
try
{
var xmlDoc = new XmlDocument();
xmlDoc.Load(queuePath);
using (XmlReader reader = XmlReader.Create(new StringReader(xmlDoc.OuterXml)))
{
queue = queueSerializer.Deserialize(reader) as List<QueueItem>;
}
}
catch (Exception e)
{
AppTrace.Write(TraceLevel.Error, string.Format("Failed to load State Queue: {0}", e.Message));
}
return queue;
}
}
エラーは次のとおりです。
Failed to load State Queue: The type initializer for 'StateManager' threw an exception.
私たちが理解しているように、これは犯人に2つの可能性を残しています:
private static XmlSerializer queueSerializer = new XmlSerializer(typeof(List<QueueItem>));
また
private static readonly string queuePath = Path.Combine(SubSystem.PersistentDirectory, "Queue.xml");
私たちは慎重にチェックSubSystem.PersistentDirectory
しましたが、それは無害であると信じています.
これはクライアントのマシンのフィールドで発生したものであり、再現できないため、内部例外を確認することはできません。