FileNotFoundException при десериализации XML - PullRequest
11 голосов
/ 07 января 2012

Недавно мы начали видеть, как FileNotFoundException время от времени выбрасывается при десериализации XML. Сообщение состоит в том, что временная сборка, используемая для отображения из XML в код, не может быть найдена. Из этого документа похоже, что это может произойти, когда этот файл не может быть создан .NET Framework (однако причина, по которой он не фиксируется даже во внутреннем исключении).

Вот исключение:

Type : System.IO.FileNotFoundException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Message : Could not find file 'C:\Documents and Settings\user\Local Settings\Temp\c5_nfoko.dll'.

Имя файла отличается при каждой ошибке, но ошибка всегда одна и та же, она происходит отсюда (полный стек вызовов внизу):

at System.Xml.Serialization.XmlSerializer.GenerateTempAssembly(XmlMapping xmlMapping, Type type, String defaultNamespace)
at System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace)
at System.Xml.Serialization.XmlSerializer..ctor(Type type)

Когда CSharpCodeGenerator пытается создать сборку. Мы использовали этот код в производстве в течение многих лет, и он был очень стабильным. Это только начало терпеть неудачу в последнюю неделю или около этого. Мы задались вопросом, может ли это иметь какое-либо отношение к последнему исправлению безопасности Microsoft , поскольку оно затрагивает версию нашего кода в .NET 2.0 и .NET 4.0 в нескольких операционных системах (XP и Server 2003).

Ошибка носит эпизодический характер, и повторный запуск процесса обычно приводит к его исчезновению. Это однопоточное приложение командной строки, которое извлекает файлы и вставляет их в базу данных.

Мне не удалось найти никого другого с такой же проблемой, но он не изолирован от той же строки кода, у нас есть пара мест, где используется код System.Xml.Serialization, и мы видели это ошибка от каждого. Этот код также не то, что мы недавно изменили.

Ближайший другой пост, который я могу найти, это этот один.

На нашей QA VM нет антивирусного сканера, поэтому я не думаю, что это проблема с этим. Мы также видели эту проблему как в нашей размещенной среде, так и на отдельном клиентском сайте.

Мы пробовали:

  1. Очистка этого временного каталога
  2. Проверка разрешений для временного каталога (пользователь является локальным администратором на коробке)
  3. Создание файлов XmlSerializers.dll с помощью sgen.exe и их развертывание в папке приложения (проблема сохраняется, как будто .NET Framework не хочет использовать эти сборки).

Если у кого-то есть идеи или предложения, которые будут полезны.

Полный стек вызовов:

Type : System.IO.FileNotFoundException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Message : Could not find file 'C:\Documents and Settings\user\Local Settings\Temp\c5_nfoko.dll'.
Source : mscorlib
Help link : 
FileName : C:\Documents and Settings\user\Local Settings\Temp\c5_nfoko.dll
FusionLog : 
Data : System.Collections.ListDictionaryInternal
TargetSite : Void WinIOError(Int32, System.String)
Stack Trace :    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
at Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch(CompilerParameters options, String[] fileNames)
at Microsoft.CSharp.CSharpCodeGenerator.FromSourceBatch(CompilerParameters options, String[] sources)
at Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromSourceBatch(CompilerParameters options, String[] sources)
at System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromSource(CompilerParameters options, String[] sources)
at System.Xml.Serialization.Compiler.Compile(Assembly parent, String ns, XmlSerializerCompilerParameters xmlParameters, Evidence evidence)
at System.Xml.Serialization.TempAssembly.GenerateAssembly(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, Evidence evidence, XmlSerializerCompilerParameters parameters, Assembly assembly, Hashtable assemblies)
at System.Xml.Serialization.TempAssembly..ctor(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, String location, Evidence evidence)
at System.Xml.Serialization.XmlSerializer.GenerateTempAssembly(XmlMapping xmlMapping, Type type, String defaultNamespace)
at System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace)
at System.Xml.Serialization.XmlSerializer..ctor(Type type)

Ответы [ 2 ]

1 голос
/ 10 января 2012

У меня была почти такая же проблема с ASP.NET.Причина в том, что временные библиотеки DLL, записанные в этой папке, где-то запоминаются, возможно, в ссылках из другой библиотеки временных файлов.

Решение состоит в том, чтобы удалить все файлы в папке C:\Documents and Settings\user\Local Settings\Temp.Некоторые из них могут быть заблокированы, и вам нужно удалять файлы в несколько итераций, потому что заблокированные файлы, скорее всего, являются источником проблемы (из моего опыта).Когда временная папка очищена, все снова работает как задумано (по крайней мере, для меня).

0 голосов
/ 14 февраля 2012

XML-сериализатор Microsoft сам по себе очень плох.Исключение, которое вы получаете, заключается в том, что .NET генерирует сборку на лету каждый раз, когда вы создаете новый сериализатор XML.Чтобы максимально предотвратить это, реализуйте словарь с ключом типа, который вы пытаетесь сериализовать, и XML-сериализатором в качестве значения.Этот тип кэширования позволит вам столкнуться с этим первым случайным исключением только при первой сериализации неизвестного типа.

Взгляните на веб-сайт Microsoft MSDN, Класс XmlSerializer .Есть параграф, в котором говорится, что я только что сказал.

...