我有用C#4.0編寫的ASP.NET Web應用程序。應用程序引用自帶配置文件的類庫。在運行時,類庫使用類似於下面的代碼加載這個具體配置:IIS Web應用程序和類庫配置 - 配置文件部署時丟失
var exeConfigPath = this.GetType().Assembly.Location;
var config = ConfigurationManager.OpenExeConfiguration(exeConfigPath);
這樣做是因爲該庫已加載其捆綁的配置,而不是應用程序配置。應用程序配置不應該關心庫的設置,不應該能夠改變它們。
現在,還有一些其他事情需要完成這個概念的工作。我必須將庫的配置文件構建操作設置爲屬性窗口中的內容,並將副本設置爲Copy Always
或Copy If Newer
。到目前爲止,文件自動進入到類庫的bin目錄和web應用程序的bin目錄中,並且從App.config
正確地重命名爲CustomLibrary.dll.config
(假定庫的DLL是CustomLibrary.dll)。
現在我面臨兩個問題。
1)當我將Web應用程序發佈到文件系統位置(映射到IIS)時,CustomLibrary.dll.config
在發佈的應用程序的bin文件夾中顯示爲App.config
。好的 - 我將在類庫項目中重命名它以符合預期的約定 - 並解決問題。
2)即使發佈,IIS也會再次編譯應用程序並將其存儲在ASP.NET Temporary Files中。有一個花哨的目錄結構,其中包含專用於每個組件的文件夾。與CustomLibrary.dll相對應的文件夾不包含其中的配置文件。由於this.GetType().Assembly.Location
將返回到臨時文件夾的路徑,應用程序無法加載配置並崩潰,因爲它應該。
我需要保留在類庫中具有配置的模式,並且能夠使其在Web應用程序中工作。手動將.config複製到臨時文件夾時,該應用程序可以正常工作,但請參閱,我真的很討厭手動複製到隨機命名的文件夾。
有沒有辦法阻止IIS使用臨時文件夾,或使它沿着配置文件複製?我相信我面臨的問題是配置相關而不是概念性的,因爲當配置文件就位時應用程序按預期工作。我寧願不要亂用配置文件的硬編碼物理路徑。
編輯:
使其更清晰,我會指出什麼,爲什麼我想要實現。這個想法是,庫和Web項目將作爲獨立的產品開發 - 在庫的配置中不會有用戶或應用程序特定的信息,因此不會因不同的使用場景而改變。它也是特定於類庫功能而不是最終應用程序。對我來說,保持庫中的配置信息是合理的(類似於Java,其中spring上下文xml文件或屬性文件與庫的jar捆綁在一起)。我想避免必須複製消費者應用程序的每個app/web配置中的配置。有些情況下,消費者應用程序是由第三方開發的,我不想依賴於他們配置我的東西的權利工作。同樣,這裏唯一的問題是沒有將配置文件複製到正確的位置。
這就是.NET一直以來的工作原理。您需要從類庫配置文件複製設置並將它們粘貼到web.config中。 – 2013-03-15 01:15:30
我明白了,我仍然相信自己已經非常接近我需要實現的目標(請參閱我的重訪帖子,瞭解我的原因)。唯一的攔截器是文件不被臨時文件夾中的IIS複製。 – 2013-03-15 08:59:04