反序列化XML时出现FileNotFoundException

本文关键字:FileNotFoundException XML 反序列化 | 更新日期: 2023-09-27 18:19:36

我们最近开始看到在反序列化XML时偶尔抛出FileNotFoundException。消息是找不到用于从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安全补丁有关,因为它会影响我们在多个操作系统(XP和Server 2003)上的.NET 2.0和.NET 4.0版本的代码。

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

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

我能找到的最接近的另一篇帖子是这篇。

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

我们已经尝试过:

  1. 正在清理此临时目录
  2. 正在检查临时目录上的权限(用户是框中的本地管理员)
  3. 通过使用sgen.exe生成XmlSerializer.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)

反序列化XML时出现FileNotFoundException

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

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

Microsoft的XML序列化程序本身就非常糟糕。您得到的异常是因为每次创建新的XML序列化程序时,.NET都会动态生成程序集。为了尽可能地防止这种情况,请实现一个字典,其中包含您试图序列化的类型的键和作为值的XML序列化程序。这种缓存只允许您在第一次序列化未知类型时遇到这种第一次机会异常。

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

我最近在将进程作为系统服务(在system用户上)运行时遇到了这个问题。在我的例子中,问题是C:''Windows''TEMP有一个只读属性。清除此属性解决了问题。

相关文章:
  • 没有找到相关文章