C# 为什么我要获取System.IO.FileLoadException:无法加载文件或程序集,大约每周在我的ASP.Net网站上加载一次?

C# 为什么我要获取System.IO.FileLoadException:无法加载文件或程序集,大约每周在我的ASP.Net网站上加载一次?,c#,asp.net,assemblies,enterprise-library,fileloadexception,C#,Asp.net,Assemblies,Enterprise Library,Fileloadexception,我有一个相当简单的内部ASP.Net网站,它大约每周加载一次Microsoft.Practices.EnterpriseLibrary.Data dll会出现问题。以下是异常消息: System.IO.FileLoadException: Could not load file or assembly 'Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null

我有一个相当简单的内部ASP.Net网站,它大约每周加载一次Microsoft.Practices.EnterpriseLibrary.Data dll会出现问题。以下是异常消息:

System.IO.FileLoadException: Could not load file or assembly 'Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. Access is denied.
File name: 'Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null'
   at foobar.Intranet.Logic.Data.UserDB.SelectByUserName(String userName)
   at foobar.Intranet.Logic.Info.User.ValidateUser(String userName) in F:\Development\foobar\foobar\foobar.Intranet.Logic\Info\User.cs:line 130
   at Login.ValidateUser(String username, String password) in e:\foobar\foobar.Intranet\Login.aspx.cs:line 32

=== Pre-bind state information ===
LOG: User = Unknown
LOG: DisplayName = Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null
 (Fully-specified)
LOG: Appbase = file:///E:/foobar/foobar.Intranet/
LOG: Initial PrivatePath = E:\foobar\foobar.Intranet\bin Calling assembly : foobar.Intranet.Logic, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: E:\foobar\foobar.Intranet\web.config
LOG: Using host configuration file: \\?\C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet.config
LOG: Using machine configuration file from C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Attempting download of new URL file:///C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/Temporary ASP.NET Files/foobar.intranet/668896d8/82d7e51c/Microsoft.Practices.EnterpriseLibrary.Data.DLL.
LOG: Attempting download of new URL file:///C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/Temporary ASP.NET Files/foobar.intranet/668896d8/82d7e51c/Microsoft.Practices.EnterpriseLibrary.Data/Microsoft.Practices.EnterpriseLibrary.Data.DLL.
LOG: Attempting download of new URL file:///E:/foobar/foobar.Intranet/bin/Microsoft.Practices.EnterpriseLibrary.Data.DLL.
ERR: Failed to complete setup of assembly (hr = 0x80070005). Probing terminated.
值得注意的事项:

  • 简单的IIS重置可修复此问题
  • 我们在单个Web服务器上运行相同的代码,没有问题。然后,我们将站点移动到两个新的负载平衡(使用粘性会话)Web服务器(所有三个Windows Server 2003 R2标准版SP1)。现在,每个负载平衡的Web服务器每周都会突然抛出一次此异常。
    • 我能想到的唯一主要区别是,我已经在负载平衡的服务器上安装了4.0.NET framework。该网站仍在ASP.NET 2.0下运行,因此我不认为这会成为一个问题
  • 我已将索引服务配置为不搜索“临时ASP.NET文件”文件夹,但它没有帮助
  • 我们在网站的任何地方都使用Microsoft.Practices.EnterpriseLibrary.Data dll。几乎每个页面都使用我们的逻辑dll,而逻辑dll反过来又利用了EnterpriseLibrary dll
  • 虽然错误只发生过一次,但我甚至查看了哪些进程正在锁定“临时ASP.NET文件”文件夹中的dll,这与服务器上正常工作的锁定没有任何区别
  • 一旦错误开始,它每次都会出错,直到执行iisreset
任何人能提供的任何见解都将不胜感激。如果我错过了什么,请告诉我

谢谢

看一看。它可能会为你指明正确的方向


我快速查看了其他SO答案,有人建议应用程序可能是针对DLL的签名版本开发的,但生产运行时只能访问未签名版本。看起来您的产品正在加载未签名的程序集(
PublicKeyToken=null
)。

安装以下nuget软件包:

安装软件包log4net-版本2.0.0 安装linqtoexcel软件包

安装软件包System.Data.Sqlite.x86-版本1.0.88.0 安装软件包ServiceStack-版本3.9.71
安装软件包ServiceStack.OrmLite.Sqlite32-Version 3.9.71

我打开了程序集绑定日志查看器,但没有显示任何内容。我将日志的位置更新为自定义位置,这样它就不会清除日志。我猜它将在“===预绑定状态信息===”之后为我提供与异常消息相同的信息。我不知道“目前不适用于参考的政策”是否与此有关?生产和开发都使用未签名的。用户描述的问题每次都会发生,而不是一周一次。我假设一旦遇到这个问题,对程序集的任何调用都会失败,并显示上述错误消息(直到执行iisreset)。Tuzo-您的假设是正确的。一旦问题开始,加载程序集的所有调用都会失败(直到执行iisreset)。我刚刚发现的一件有趣的事情是,IIS目录安全匿名访问用户不是IUSR_MachineName,而是IUSR_OldMachineName。此后,我更新了manager用户和组下的用户名,但我必须手动更新IIS匿名用户帐户。有人知道这是否会影响它吗?我在尝试从.NET4.0应用程序加载.NET2.0程序集时遇到了相同的错误。