2009-09-14 38 views
6

我們的網站使用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?

回答

1

嗯,我考慮了一下(師德和我在同一家公司工作),我們有兩種選擇,據我可以告訴:

  1. 什麼也不做。本文包含一位來自一個asp.net團隊成員的評論,它展示了幾種防止緩存增長和增長的方法:http://forums.asp.net/p/985551/3297967.aspx#3297967,但並未解決爲每條可能的路由寫入緩存條目的問題,但保證緩存不會拋出一些內存不足的異常。

  2. 問題解決了與變通方法,使用查詢字符串參數,而不是固定的路線(/controller.mvc?action=X & PARAMS = Y代替controller.mvc /動作/ PARAMS)。這樣只有controller.mvc被緩存。

畢竟,我不認爲這真的是一個問題。

+2

選項2似乎有些跛,因爲它殺死的ASP.NET MVC框架的最好的,最明顯的特徵之一。在我們的例子中,這並不重要,因爲我們也有一個ISAPI重寫DLL。但它似乎仍然是一個蹩腳的解決方案。 – 2009-09-15 06:45:35