在bin文件夹中存在程序集文件时空闲后ASP.net异常“FileNotFoundException”

时间:2012-09-17 20:33:15

标签: c# asp.net .net-assembly filenotfoundexception

文件存在,名称正确且未损坏。如果我将它从“Bin”移出并重新进入,它再次工作,大约5分钟,然后错误发生回来。刷新文件的任何操作都可以,重新发布,重命名或移动会使网站重新工作一会儿。

  

{“消息”:“无法加载文件或程序集\ u0027Ouranos,   版本= 1.0.0.0,Culture = fr-CA,PublicKeyToken = null \ u0027或其中之一   它的依赖关系。 Lefichierspécifiéestintrouvable。“,”StackTrace“:”   在Services.Asynchrone(String DimensionX,String DimensionY,String   Action,String Culture,String Utilisateur,String Interface,String   Source,String Champ,String Valeur,String Classement,String   Direction,StriFileNotFoundExceptionng Page,String   迭代)”, “ExceptionType”: “System.IO”}

Fusion确实给了我一个错误代码(0x80070002),它指向我获取Process Monitor。这导致我到临时装配文件夹。现在我可能错了。比较一个健康的网站和病态网站的缓存文件,我发现了一些奇怪的东西。

  • 健康的网站,作为缓存中BIN的所有DLL。
  • 病态网站在缓存中缺少两个存在于BIN中的DLL。

现在,我知道ASP.net倾向于说主要库是缺失的,因为它实际上是缺少的引用库之一。在目前的情况下,我不知道我能做些什么来解决这个问题。这两个DLL没有在缓存中设置,因此当它尝试加载主DLL时,无法从缓存中找到另外两个DLL并抛出在主DLL上找不到的文件。

两个罪魁祸首是:

  • PresentationCore.dll中
  • WindowsBase.dll中

2 个答案:

答案 0 :(得分:0)

要解决此类错误,您可以使用Fusion日志,有关如何启用它以及如何使用它的说明,请访问:How to enable assembly bind failure logging (Fusion) in .NET

答案 1 :(得分:0)

以下代码似乎实际上解决了这个问题。它检查装配所需的所有装配并加载缺失的装配。我之前有过这样的代码并且它不起作用,因为没有!(Assemblée is System.Reflection.Emit.AssemblyBuilder) && (Assemblée.GetType().FullName != "System.Reflection.Emit.InternalAssemblyBuilder")不存在并且代码在.net 4.0及更高版本中导致异常。它并不优雅,但它确实起到了作用。

public static void Chargeur()
{
    var Assemblées_Chargées = (from Assembly Assemblée in AppDomain.CurrentDomain.GetAssemblies() where !(Assemblée is System.Reflection.Emit.AssemblyBuilder) && (Assemblée.GetType().FullName != "System.Reflection.Emit.InternalAssemblyBuilder") && (!Assemblée.GlobalAssemblyCache) && (Assemblée.CodeBase != Assembly.GetExecutingAssembly().CodeBase) select Assemblée).ToList();

    var Chemins_Chargés = Assemblées_Chargées.Select(Assemblée => Assemblée.Location).ToArray();
    var Chemins_Référencés = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.dll");
    var Assemblées_NonChargées = Chemins_Référencés.Where(Références => !Chemins_Chargés.Contains(Références, StringComparer.InvariantCultureIgnoreCase)).ToList();

    Assemblées_NonChargées.ForEach(path => Assemblées_Chargées.Add(AppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(path))));
}