2009-12-14 74 views
0

我正在開發由.NET網站上的許多Web應用程序使用的組件(HttpModule),並且我希望組件易於維護。我已經提出了下面概述的內容,但是希望看看是否對實現有任何正面/負面的想法或一般性反饋,因爲我不是100%熟悉程序集加載,特別是在內存開銷方面。引用常見的可更新程序集的ASP.NET網站

(我真的不希望這樣做:Create Your Own .NET Assembly Cache

輕量級的HttpModule本身是在GAC,並從網站的根web.config引用。在每個請求中,它會打開一個僅包含強名稱的程序集名稱(例如「My.MyLibrary,Version = 1.1.0.0,Culture = en,PublicKeyToken = 03689116d3a4ae33」)的文本文件(存儲在Web的根/ bin中),然後檢查當前AppDomain查看它是否已經被引用(通過GetAssemblies()迭代)。如果不是,它然後調用Assembly.Load來加載myLibrary,並使用基本的Reflection來調用My.MyLibrary中的自定義方法,該方法實際上完成了HttpModule的預期處理工作。

My.MyLibrary本身也在GAC中。要在沒有任何應用程序重新啓動的情況下升級應用程序,請在GAC中添加新版本,然後在文本文件中編輯字符串。我正在使用文本文件,因爲a)速度很快,b)我不想更新machine/web.config,並導致重新定向HttpModule以使用新版本的My.MyLibrary。它似乎工作正常。舊版本可以在GAC終於準備好時從GAC中卸載。所以希望只需要一次應用程序池/ iis重置就可以改變HttpModule部分。

任何答覆太讚賞了!

- 將會

回答

0

個人而言,我會說,如果你能避免使用任何後期綁定它會更好,但你要能夠有自由就在你的應用程序拋出一個新的組件,然後它看起來像後期綁定是有道理的。

關於您存儲和檢索程序集列表的方法,我將使用XML對象並從文件中加載它。您會發現通過這種方式更簡單地添加額外信息,否則您將不得不維護自己的文件格式。

您可能還想考慮添加一些代碼來捕獲從這些程序集生成的錯誤,卸載它們並在文件中放置一個標誌,告訴HttpModule在更新之前不加載它。

+0

謝謝! 最終由HttpModule運行的代碼非常簡單,所以當我進行測試/預先製作時,我會運行一些測試,看看靈活性是否值得我從後期綁定中獲得的任何性能。 是的,我想將文本文件擴展爲XML文件,但主要是想要加載一個網站的通用DLL的通用體系結構的f/back而不需要重新啓動應用程序。我在網上發現的大多數文章/帖子/評論似乎暗示這是不可能的,所以我想知道是否有任何其他方法,或者我打算使用的方法有任何明顯的疏忽/問題。 – 2009-12-16 14:22:37

+0

我不認爲我要卸載程序集,因爲我不想創建任何新的AppDomain。 HttpModule中有一攬子錯誤處理。 – 2009-12-16 14:23:21

+0

首先我會說它不是一個好的做法,有一個建築物,你只需添加任何東西,但沒有堅實的計劃,當它完成時將其刪除,這是因爲在未來的某個時刻,你會堵塞資源問題,並且必須重新啓動你的應用程序,至少釋放內存。 組件的動態加載在ASP.Net中是可行的,因爲您可以完全訪問.Net框架。你打算如何使用你加載的組件? 他們會像標準HttpModule一樣行事,但不需要重新啓動應用程序域? – Robert 2009-12-17 15:44:59