2012-10-16 35 views
2

我在我的WCF服務中使用.Net 4.0 MemoryCache。 我原來用的是默認的緩存如下:.Net 4.0 MemoryCache清除

var cache = MemoryCache.Default; 

然後做通常的模式是試圖在緩存中找到的東西,得到,然後 設置到緩存中,如果沒有找到(代碼段/僞代碼如下所示):

var geoCoordinate = cache.Get(cacheKey) as GeoCoordinate; 
if (geoCoordinate == null) 
{ 
    geoCoordinate = get it from somewhere; 
    cache.Set(cacheKey, geoCoordinate, DateTimeOffset.Now.AddDays(7)); 
} 

我發現我的參賽作品在約。 2分鐘。即使我的代碼將丟失的條目放回緩存中,隨後的緩存獲取也會返回null。 我的WCF服務由IIS 7.5託管。如果我回收應用程序池,則一切正常工作2分鐘,但之後將重複上述模式。

經過一番研究,我做了下面的代替: var cache = MemoryCache.Default;

//用新代碼來創建CACHE如下:

var config = new NameValueCollection(); 
//Hack: Set Polling interval to 10 days, so will no clear cache. 
config.Add("pollingInterval", "10:00:00:00"); 
config.Add("physicalMemoryLimitPercentage", "90"); 
config.Add("cacheMemoryLimitMegabytes", "2000"); 

//instantiate cache 
var cache = new MemoryCache("GeneralCache", config); 

看來,不管我放到physicalMemoryLimitPercentage,或cacheMemoryLimitMegabytes似乎並沒有幫助。但把pollingInterval放大到datespan呢。

ie:如果我設置如下: config.Add(「pollingInterval」,「00:00:15:00」); 然後一切正常工作15分鐘。

注意:如果我的WCF服務由我的開發環境上的IISExpress託管,我無法重現。 當我的WCF服務由IIS 7.5託管時,這似乎也發生了。 我在IIS 7.5上的應用程序池沒有被回收。

有沒有人經歷過這樣的事情? 我看到了下面: MemoryCache does not obey memory limits in configuration

感謝,

馬特

回答

1

我也看到了這個問題,並提出了錯誤與MS here用一個簡單的再現項目。

MS已經解決了上述我提交的錯誤 - 附近有一項工作,即將推出QFE for .net 4以及確認這不是4.5中的問題。解決方法

但是我可以提供更多關於自己重新創建條件所需的條件的信息。應用程序池需要處於集成管道模式才能看到此問題 - 經典模式修復了此問題,但刪除了遷移到IIS 7.5的一些好處。 同樣當使用集成模式時,如果我使用內置的應用程序池標識(例如ApplicationPoolIdentity),我也沒有看到此問題。不過,我的應用程序需要使用服務帳戶作爲自定義標識運行,並且此時我看到了該行爲。因此,如果你不需要集成模式或自定義標識,你可以解決這個問題。

也許內置帳戶有權執行由我的自定義標識沒有的pollingInterval啓動的緩存內存統計信息收集,我不知道。

希望這會有所幫助,甚至可以讓其他人加入更多的小點來找出更好的解決方法。

+0

解決方法a未來的QFE解決方案已由MS發佈在我提交的錯誤上https://connect.microsoft.com/VisualStudio/feedback/details/764911/memorycache-gets-disposed-after-pollinginterval-when-used -in-webapp-in-integrated-pipeline-mode#詳細信息以及確認這在.net 4.5中得到了解決 – scubadam