2011-05-05 19 views
14

HttpContext.Cache'de tam bir tamsayı değeri, 5 dakikadan daha uzun bir süre sona erme süresiyle saklıyorum. Ancak, 6 dakika (veya daha uzun) bekledikten sonra, tamsayı değeri hala Önbellekte (yani, mutlak son kullanma geçmiş olsa bile hiçbir zaman kaldırılmaz). İşte kullanıyorum kodu:ASP.net Önbellek Mutlak Süre sonu çalışmıyor

public void UpdateCountFor(string remoteIp) 
{ 
    // only returns true the first time its run 
    // after that the value is still in the Cache 
    // even after the absolute expiration has passed 
    // so after that this keeps returning false 
    if (HttpContext.Current.Cache[remoteIp] == null) 
    { 
     // nothing for this ip in the cache so add the ip as a key with a value of 1 
     var expireDate = DateTime.Now.AddMinutes(5); 
     // I also tried: 
     // var expireDate = DateTime.UtcNow.AddMinutes(5); 
     // and that did not work either. 
     HttpContext.Current.Cache.Insert(remoteIp, 1, null, expireDate, Cache.NoSlidingExpiration, CacheItemPriority.Default, null); 
    } 
    else 
    { 
     // increment the existing value 
     HttpContext.Current.Cache[remoteIp] = ((int)HttpContext.Current.Cache[remoteIp]) + 1; 
    } 
} 

I ("127.0.0.1") anahtar "127.0.0.1" ile önbelleğine 1 yerleştirir ve şu andan itibaren 5 dakika mutlak süre sonu UpdateCountFor ilk çalıştırdığınızda beklenildiği gibi. Sonraki her çalışma, önbellekteki değeri artırır. Ancak, 10 dakika bekledikten sonra Önbellekteki değeri artırmaya devam eder. Değer asla sona ermez ve asla Önbellekten kaldırılmaz. Neden?

Anlaşmam, mutlak bir son kullanma süresinin, öğenin yaklaşık o anda kaldırılacağı anlamına gelir. Yanlış bir şey mi yapıyorum? Bir şeyi yanlış anladım mı?

5 dakika sonra önbellekten kaldırılacak olan değeri bekliyorum, ancak projeyi yeniden başlatana kadar orada kalıyor.

Bu, tüm yerel makinemde .NET 4.0 üzerinde çalışıyor.

+0

Web.config dosyasında herhangi bir garip önbellek yapılandırma ayarlarınız var mı? –

+0

Hayır, varsayılan web.config var – smoak

cevap

12

Bu hat çıkıyor:

HttpContext.Current.Cache[remoteIp] = ((int)HttpContext.Current.Cache[remoteIp]) + 1; 

önceki değerini çıkarır ve mutlak veya kayma sona erme süresi ile değerini yeniden ekler. Bunu çözmek için bir yardımcı sınıf zorunda kaldı ve böylece gibi kullanmalı: Bu sorunu çözmek ve hala bunun için güncellemeler sağlarken sayaç düzgün mutlak zaman aşımına izin verir

public class IncrementingCacheCounter 
{ 
    public int Count; 
    public DateTime ExpireDate; 
} 

public void UpdateCountFor(string remoteIp) 
{ 
    IncrementingCacheCounter counter = null; 
    if (HttpContext.Current.Cache[remoteIp] == null) 
    { 
     var expireDate = DateTime.Now.AddMinutes(5); 
     counter = new IncrementingCacheCounter { Count = 1, ExpireDate = expireDate }; 
    } 
    else 
    { 
     counter = (IncrementingCacheCounter)HttpContext.Current.Cache[remoteIp]; 
     counter.Count++; 
    } 
    HttpContext.Current.Cache.Insert(remoteIp, counter, null, counter.ExpireDate, Cache.NoSlidingExpiration, CacheItemPriority.Default, null); 
} 

.

+0

Bu, API'nin çok yararlı olduğu bir durumdur. İndeksleyiciyi kullanarak gördüğünüz depolama mekanizması ile çalışmayı zorlamak yerine, strangeness –

+1

'a katılıyorum. Sonunda, tüm bunları bulmak için [ilspy] (http://wiki.sharpdevelop.net/ilspy.ashx) kullanarak kaynaklardan geçtim. – smoak

3

DateTime.UtcNow kullanarak zaman aşımı sürenizi datetime.Now yerine kullanmayı deneyin. Aşağıda açıklanan sorunla çalışıyor olabilir:

absoluteExpiration Tipi: System.DateTime Eklenen nesne süresi dolar ve önbellekten kaldırılır aldığımız zaman. ile ilgili sorunları gibi yerel saatlerde, standart saatten gün ışığından zamana kadar önlemek için, bu parametre değerini için Şimdi değil, bu parametre değerini kullanın. mutlak son kullanma tarihini kullanıyorsanız, slidingExpiration parametresi NoSlidingExpiration olmalıdır.

+0

DateTime.UtcNow.AddMinutes (5) kullanmak için değiştirme; çalışmadı :( – smoak

+0

Bummer Kodunuzun doğru olduğunu düşünüyorum. Bana doğru görünüyor.Ne zaman önbellekten kaldırılır ?.Belki de bu, onu tetikleyen şey hakkında bazı ipuçları verir. –

+0

İşte bu, önbellekten hiç kaldırılmıyor. Bu yaşadığım problem. 5 dakika sonra kaldırılmasını bekliyorum, ancak projeyi yeniden inşa edene kadar orada kalıyor. – smoak

0

Smoak'ın yayınladığıdan daha basit bir cevap var. Bu örneği başlangıç ​​noktası olarak kullanarak, güncellenmiş kod çalışır ve yeniden ekleme gerektirmez. Bunun nedeni, sınıfların referans türleri olması. Böylece, sınıf örneğindeki sayacı güncelleştirdiğinizde, önbelleğin bir güncelleştirmeyi tetiklemesine neden olmaz.

public class IncrementingCacheCounter 
{ 
    public int Count; 
} 

public void UpdateCountFor(string remoteIp) 
{ 
    IncrementingCacheCounter counter = null; 
    if (HttpContext.Current.Cache[remoteIp] == null) 
    { 
     counter = new IncrementingCacheCounter { Count = 1}; 
     HttpContext.Current.Cache.Insert(remoteIp, counter, null, DateTime.Now.AddMinutes(5), Cache.NoSlidingExpiration, CacheItemPriority.Default, null); 
    } 
    else 
    { 
     counter = (IncrementingCacheCounter)HttpContext.Current.Cache[remoteIp]; 
     counter.Count++; 
    } 
} 
İlgili konular