我們的網站使用ASP.NET MVC作爲其中的一部分頁面。這些URL通常具有以下格式:http://oursite/detail.mvc/12345/pictures/在此URL中,12345是數據庫中的ID。我們有幾十萬個對象,爲此我們顯示詳細頁面。最近我們注意到網站內存使用量的增加,所以我調查了一下。我們做了一個生產站點的內存轉儲,發現大量的內存使用是由形式爲「dmachine/webroot/1/site/detail.mvc/12345/pictures /」和「H :\網站\ detail.mvc \ 12345 \圖片\」。防止許多不同的MVC URL填充ASP.NET緩存
進一步調查和大量使用反射已經表明,這些字符串存儲在ASP.NET緩存在System.Web.CachedPathData對象的形式。這是由ConfigurationManager在從web.config文件讀取信息時創建的。它調用HttpContext.GetSection() - > HttpContext.GetConfigurationPathData() - > CachedPathData.GetVirtualPathData()。最終,在CachedPathData.GetConfigPathData中,將爲請求的路徑確定虛擬路徑,並將其緩存在ASP.NET緩存中而不會失效。
現在的問題是,我們有幾百萬不同的網址,併爲每個路徑配置系統存儲了一些在高速緩存中的字符串(用configPath,虛擬路徑,物理路徑)的。隨着時間的推移,這些信息會消耗幾百MB,幾乎全部緩存中的數據。
我認爲當內存變得稀缺,這些條目將被刪除,但在操作他們不相信,成長過程和成長。這看起來效率很低。有沒有辦法告訴HttpContext不要爲每個唯一的URL緩存這些信息?或者,也許我們可以先將請求路徑映射到更簡單的URL,然後用它來選擇正確的web.config?
選項2似乎有些跛,因爲它殺死的ASP.NET MVC框架的最好的,最明顯的特徵之一。在我們的例子中,這並不重要,因爲我們也有一個ISAPI重寫DLL。但它似乎仍然是一個蹩腳的解決方案。 – 2009-09-15 06:45:35