反序列化XML时的FileNotFoundException

时间:2012-01-06 21:27:04

标签: c# .net serialization filenotfoundexception

我们最近开始看到FileNotFoundException在反序列化XML时偶尔被抛出。消息是无法找到用于从XML映射到代码的临时程序集。从this文档看起来,当.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 security patch有关,因为它会影响我们在多个操作系统(XP和Server 2003)上的.NET 2.0和.NET 4.0中的代码版本。

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

我无法找到有同样问题的其他人,但它没有被隔离到相同的代码行,我们有几个地方使用System.Xml.Serialization代码我们已经从每个人看到这个错误。这段代码也不是我们最近改变过的。

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

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

我们尝试过:

  1. 清理此临时目录
  2. 检查临时目录的权限(用户是框中的本地管理员)
  3. 使用sgen.exe生成XmlSerializers.dll,并将它们部署到app文件夹(问题仍然存在,就像.NET Framework不想使用这些程序集一样)。
  4. 如果有人有任何有用的想法或建议。

    完整的callstack:

    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)
    

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

微软的XML序列化器本身就很糟糕。您获得的例外是因为.NET每次创建新的XML序列化程序时都会动态生成程序集。为了尽可能地防止这种情况,请使用您尝试序列化的类型的键和XML序列化程序作为值来实现字典。这种缓存只允许您在第一次序列化未知类型时遇到此第一次机会异常。

查看Microsoft的MSDN网站 XmlSerializer Class 。有一段告诉你我刚才说的话。

答案 2 :(得分:0)

我最近在将进程作为系统服务运行时(在SYSTEM用户上)遇到了这个问题。在我的情况下,问题是C:\ Windows \ TEMP具有只读属性。清除此属性可以解决问题。