c# - 反序列化 XML 时出现 FileNotFoundException

标签 c# .net serialization filenotfoundexception

我们最近开始看到在反序列化 XML 时偶尔会抛出 FileNotFoundException。消息是找不到用于从 XML 映射到代码的临时程序集。来自 this文档看起来当 .NET Framework 无法创建此文件时可能会发生这种情况(但是即使在内部异常中也未捕获的原因)。

异常(exception)情况:

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 security patch 有关因为它会影响我们在多个操作系统(XP 和 Server 2003)上的 .NET 2.0 和 .NET 4.0 代码版本。

该错误是偶发的,再次运行该过程通常会导致错误消失。这是一个单线程命令行应用程序,可检索文件并将它们插入数据库。

我没能找到其他人有同样的问题,但它不是孤立的同一行代码,我们有几个地方使用 System.Xml.Serialization代码,我们已经从每个代码中看到了这个错误。此代码也不是我们最近更改的内容。

我能找到的最接近的其他帖子是 this一个。

在我们的 QA VM 上没有病毒扫描程序,所以我认为这不是问题。我们还在我们的托管环境和单独的客户端站点中看到了这个问题。

我们已经尝试过:

  1. 清理这个临时目录
  2. 检查临时目录的权限(用户是 box 的本地管理员)
  3. 使用 sgen.exe 生成 XmlSerializers.dll 并将它们部署到应用程序文件夹(问题仍然存在,就好像 .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)

最佳答案

我在使用 ASP.NET 时遇到了几乎相同的问题。原因是在该文件夹中编写的临时 DLL 会被记住某处,可能在其他临时 DLL 的引用中。

解决方法是删除C:\Documents and Settings\user\Local Settings\Temp文件夹中的所有文件。其中一些可能被锁定,您需要在几次迭代中删除文件,因为锁定的文件很可能是问题的根源(根据我的经验)。当临时文件夹清除后,一切都会再次按预期工作(至少对我而言)。

关于c# - 反序列化 XML 时出现 FileNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8764742/

相关文章:

c# - 检测 'dead' 测试和硬编码数据与受约束的非确定性

c# - 如何迭代文档库中的文件

c# - 当线程获得未处理的异常时 CLR 退出

c# - System.Windows.Size 和 System.Drawing.Size 有什么区别?

C# Process.Start 路径

c# - SqlBulkCopy 计算字段

python - Django 自然键不适用于固定装置?

c# - 将自定义类的集合添加到 Settings.Settings

通过二进制格式化程序进行列表序列化和反序列化

Javascript 连接表格单元格 ASP.NET MVC