[英]Could not load file or assembly 'log4net
好的,在將我們的一個 Web 應用程序部署到我們的實時服務器時,我遇到了一個非常奇怪的問題。
我們的應用程序使用 log4net 來記錄大量操作,在部署后幾個小時后,我們得到以下異常。
無法加載文件或程序集“log4net,版本=1.2.9.0,文化=中性,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 編譯
當我們轉移到 VS 2010 和 .NET 4.0 時,我們也遇到了這個問題,我們根本不使用 log4net,但我懷疑我們使用的其他東西(也許是 Crystal Reports?),我還懷疑我們使用了一個 dll也是一個 32 位 dll,因為當我將 IIS 中應用程序池的高級設置下的“啟用 32 位應用程序”選項更改為“真”時,一切又恢復了。
可能會問明顯的問題,但我假設您的 bin 文件夾中的 log4net.dll 是正確的版本?
如果您有多個項目引用同一個 DLL 的不同版本,則后一個項目將 DLL 復制到前一版本的情況並不少見。
假設您有多個需要支持的 log4net 副本,我能想到的最佳解決方案是向您的配置添加探測並將此版本放在另一個文件夾中。
檢查您在編譯時綁定的版本(您的文件引用)和運行時使用的版本(首先查看 GAC,然后查看本地)
通常,GAC 中的版本與您作為文件參考的版本不同。 請檢查這個。
還要清理 ASP.NET 臨時目錄並執行 IIS 重新啟動(cmd 提示 -> iisreset)
我遇到了同樣的問題,如果您使用 GIT,這可能會對您有所幫助。
問題原來是我的 Log4net.dll 文件位於一個名為log的文件夾中。 .gitignore 配置文件排除(默認情況下)所有名為 log 的文件夾。
我敢打賭,您的 JIT 編譯器沒有對該共享的寫訪問權限。 似乎 JIT 編譯器不時重新編譯整個站點,也許是在它被回收時。
一種選擇是部署預先構建的站點。 這樣就沒有重新編譯。 另一種選擇是您將 JIT 編譯器的寫訪問權限授予您的共享。 它可能與運行您的 Web 服務的用戶相同,例如。 SYSTEM、NETWORK SERVICE 或 LOCAL SERVICE 組或 IIS_* 用戶之一...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.