2010-03-16 61 views
3


由於舊的ISAPI過濾器遲早會死亡,我想將IIS 6中使用的舊ISAPI過濾器重寫爲用於IIS 7的模塊。該模塊將在全局範圍內使用,這意味着它將會在安裝了IIS 7.5的Windows Server 2008 R2上的每個站點中使用,它將承載數千個網站並管理大約50個應用程序池。
我現在的問題是,如果我應該在託管或非託管代碼中編寫該模塊?我關心託管代碼的一個問題是由於.NET框架開銷導致的大量內存消耗。我不知道這將如何影響服務器的性能。
我已經在託管以及非託管代碼中編寫了模塊。所以這不是困擾我的決定。但如果沒有巨大的缺點,我寧願用C#編寫模塊。
關於這個問題的任何建議?IIS7模塊 - 託管還是本機?

回答

5

裏克斯特拉爾offered sound advice關於這個話題,我在learn.iis.net的文章中曾多次重複過。

瞭解使用所有這些能力做錯事情的可能性也很重要。首先請記住,託管代碼比Web服務器中的本機代碼慢。通過將託管代碼引入核心服務器,您會降低Web服務器的性能。具體而言,當在集成模式下運行並且存在託管模塊時,託管代碼與非託管代碼之間的上下文切換是昂貴的。我已經和一些微軟的開發者談過了,他們正在努力研究如何通過儘可能多的批量調用託管代碼組件來優化這些上下文切換,並儘可能地保留託管代碼。

默認情況下託管代碼是可選的 - 所有核心模塊都是本機代碼,因此添加託管模塊是您必須做出的明確決定。 如果您已經在使用ASP.NET,那麼這個決定可能是一件容易的事。但是,如果您今天運行的是原始ISAPI擴展或模塊,那麼您可能需要花很長時間仔細查看託管代碼是否會很好地適應性能。

簡而言之,如果所有應用程序都是ASP.NET,那麼爲IIS編寫託管模塊應該很少或根本沒有開銷 - 這是一個簡單的選擇。然而,如果網站將而不是否則將加載CLR,那麼這樣做是爲了執行你的模塊將是昂貴的,你會仔細考慮(測量!)的影響,以確定是否性能受到影響值得開發時間生產力的提升。

1

取決於。

如果您可以保留所有管理的應用程序,請進行管理。這允許一個純粹的託管堆棧。我會努力的;)

關於記憶 - 忘記它。認真。管理IIS 7核心,根據需要掛接傳統堆棧。所以,你已經有.NET了,不管你喜不喜歡。此外,現代服務器有相當多的memroy - 即使池運行32位(強烈推薦),仍然有50池;)服務器沒有64mb RAM;)

+0

池正在運行32位... – 2010-03-16 13:44:12

+0

對不起,但是這個說法完全是錯誤的:「IIS 7核心管理,根據需要掛鉤在傳統堆棧中。」 恰好相反 - IIS 7核心是本機的,並根據需要提取CLR。改變之處在於,它現在將託管代碼直接集成到管道中,但只有在加載託管處理程序時纔會執行。 – hemp 2010-10-08 18:05:54