簡體   English   中英

將ASP.NET 4 App dll進行卷影復制,但改為加載bin dll

[英]ASP.NET 4 App dll is shadow copied but bin dll is loaded instead

在大型asp.net 4應用程序中存在一個非常奇怪的問題。 IIS有時不是從卷影副本位置加載模塊,而是從dll最初來自的bin目錄加載。

有誰知道IIS模塊加載的工作方式,這是正常現象還是錯誤?

這是導致我們的問題

  • 在開發中; 相應的dll被鎖定在bin文件夾中,這意味着msbuild無法在構建時替換它。
  • 這導致我們遇到一個特別令人討厭(且很難找到)的問題(正在與黑客一起解決),其中我們在nhibernate queryovers中獲取TypeMismatchException

筆記

  • 在Win7和WinServer2008R2,IIS 7.5上運行的ASP.NET 4應用程序,使用MVC3,MVC4,WebForms,WebApi的多個項目
  • 通過附加VS調試器並檢查加載的模塊而獲得的模塊信息
  • 如果我IISRESET並清除temp asp.net文件文件夾,然后將應用程序后台處理,則dll將全部復制到卷影復制位置,然后從那里加載。 如果我然后再次執行IISRESET並后台處理應用程序,則會從bin位置而不是卷影復制位置加載模塊
  • 這僅影響Web項目的項目依賴關系,始終從卷影副本位置加載入口點。 IE Proj.Web將從卷影副本位置加載,該Proj.BusinessLogicProj.DataAccess的項目依賴項將從bin文件夾加載,外部依賴項(自動映射器,瞥見等)將從卷影副本位置加載。
  • 我們不會在代碼web.config或IIS config(默認設置)中覆蓋任何應用程序池或應用程序域配置。
  • 無法找到詳細記錄了模塊加載或應用啟動的任何位置。

幾周前發現了此問題的根本原因,希望現在發布以幫助遭受類似問題的任何人。

在我們的一些開發人員經過一番努力之后,我們發現這是由於我們在掃描dll進行nhibernate配置時所造成的。

當我們從代碼中顯式加載dll時,我們濫用了Assembly helper方法。 而不是使用Assembly.LoadFrom(assemblyPath)而是使用Assembly.LoadFile(assemblyPath) 這些方法之間存在許多差異,此處相關的是LoadFile()加載指定的文件,而LoadFrom()將應用邏輯以從其他位置(如temp,cache或GAC LoadFrom()查找程序集。 有關差異的更多詳細信息,請參見此問題

無論如何,在更改了這一行代碼之后,我們所有的問題都消失了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM