好的,在将我们的一个Web应用程序部署到我们的实时服务器时,我遇到了一个非常奇怪的问题。
我们的应用程序使用log4net来记录大量的操作,在部署后的几个小时后,我们得到以下异常。
无法加载文件或程序集'log4net,Version = 1.2.9.0,Culture = neutral,PublicKeyToken = b32731d11ce58905'或其依赖项之一。访问被拒绝。
以下是我使用的相关web.config添加内容。
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
<appender name="ErrorLogFileAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="D:\SomeLocation\Errorlog"/>
<param name="AppendToFile" value="true"/>
<param name="RollingStyle" value="Size"/>
<param name="maxSizeRollBackups" value="-1" />
<param name="maximumFileSize" value="100MB" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/>
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="FATAL" />
<param name="LevelMax" value="FATAL" />
</filter>
</appender>
<appender name="BookingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="D:\SomeLocation\BookingInfoLog"/>
<param name="AppendToFile" value="true"/>
<param name="RollingStyle" value="Size"/>
<param name="maxSizeRollBackups" value="-1" />
<param name="maximumFileSize" value="100MB" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/>
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="INFO" />
<param name="LevelMax" value="FATAL" />
</filter>
</appender>
<root>
<level value="ALL"/>
<appender-ref ref="BookingLogFileAppender"/>
<appender-ref ref="ErrorLogFileAppender"/>
</root>
</log4net>
它在我们的本地计算机和开发服务器上工作正常但不在现场。
顺便说一下,在web.config更新或应用程序池回收之后,JIT编译器在服务器上运行后,或者甚至很长一段时间后,它似乎都会中断!
更新:我们的实时服务器从共享位置运行所有网站。我设法在另一台运行该应用程序的服务器上复制此问题。将网站设置为从本地驱动器运行时,问题就会消失,但我们的托管要求我们从共享运行。任何想法为什么log4net将从共享运行权限问题。应用程序再次运行,直到另一个JIT编译发生
答案 0 :(得分:8)
当我们迁移到VS 2010和.NET 4.0时,我们也遇到了这个问题,我们根本不使用log4net,但我怀疑我们使用的其他东西(也许是Crystal Reports?)而且我也怀疑有一个dll我们使用的是32位dll,因为当我将IIS中应用程序池的高级设置下的“启用32位应用程序”选项更改为“True”时,一切都恢复正常。
答案 1 :(得分:5)
请问显而易见但我假设您的bin文件夹中的log4net.dll是正确的版本?
如果您有多个项目引用同一DLL的不同版本,则后一个项目将DLL复制到先前版本并不罕见。
假设您需要支持多个log4net副本,我能想到的最佳解决方案是将探测添加到您的配置并将此版本放在另一个文件夹中。
答案 2 :(得分:1)
检查在编译时绑定的版本(您的文件引用)和运行时使用的版本(首先在GAC中查看,然后在本地查看)
通常,GAC中的版本与您作为文件引用的版本不同。请检查一下。
同时清理ASP.NET临时目录并执行IIS重启(cmd提示符 - &gt; iisreset)
答案 3 :(得分:0)
我敢打赌你的JIT编译器没有对该共享的写访问权。似乎JIT编译器不时地重新编译整个站点,也许它会被回收。
一种选择是部署预构建的站点。这样就没有重新编译了。另一个选择是您将JIT编译器的写访问权授予您的共享。有可能是与运行您的Web服务的用户相同的用户,例如。 SYSTEM,NETWORK SERVICE或LOCAL SERVICE组或者IIS_ *用户之一...
答案 4 :(得分:0)
我遇到了同样的问题,如果您使用GIT,这可能会对您有所帮助。
原来的问题是,我的Log4net.dll文件放在了一个名为 log 的文件夹中。 .gitignore配置文件(默认情况下)排除所有名为log的文件夹。