2009-09-17 20 views
5

ASP.NET MVC web sitemde OutputCaching'i kullanmaya çalışıyorum. Sorun şu ki, benim querystring paramların değerini değiştirmeye çalıştığımda, istenen ilk madde için veriyi geri getiriyor! , Özel özellik 'Anahtar' adlı bir sorgu dizesi param denetler ve bellek sözlükte bir denetler - ApiAuthorize:Önbelleğe alma, ASP.NET MVC web sitemde çalışmıyor mu?

İşte

[ApiAuthorize] 
[HandleErrorAsJson] 
public class SearchController : Controller 
{ 
    [AcceptVerbs(HttpVerbs.Get)] 
    [OutputCache(Duration = 60, VaryByParam = "*")] 
    public ActionResult ScoreCard(string foo, byte? bar, byte? pewpew) 
    { 
    .. 
    } 
} 
  • ... (değişti param adlarıyla) NOT 1 kod bu var olup olmadığını görmek için.
  • Not 2: HandleErrorAsJson - özel durum oluşturulduğunda/atılırsa hata iletisini json olarak döndüren özel öznitelik.

ve burada ben bu eyleme yapıyorum iki örnek çağrıları var: -

böylece verileri GET = Merhaba dünya, Pew Pew) 200 tamam olarak döndürülür. Ardından ikinci sesli arama, bir 200 Tamam, ancak önceki çağrıya ait verilerle döner.

Ayrıca, herhangi bir proxy sunucusu kullanmıyorum. Eğer OutputCache özniteliğini açıklarsam, her şey iyidir.

Ben de ..... (el i cache gerektiği her defasında listeleme) Aşağıdaki denedim

[OutputCache(Duration = 60, VaryByParam = "foo,key,bar,pewpew")] 

Hayır şans :(ben emin olmak için ne

Bildirim i API 'Anahtar' parametresini önbellek benzersiz anahtarının bir parçası olarak ekleyin.İnsanlar aynı şeyi aramak istemiyorum, ancak ikinci kişi doğru anahtara sahip değilse, önbelleğe alınmış bir sonuç almamalılar. ancak bir hata mesajı (teknik olarak, 401 Yetkili Değildir, ancak yine de) ...

Thou ghts?

cevap

4

VaryByParam'daki parametrelerin listesi, virgülle sınırlandırılmış değil, noktalı virgülle ayrılmış olmalıdır. Bunu dene. Dedi ki, * çalışmalıydı.

+0

+1 daha doğrudan doğruya tartışmaya odaklanmış durumda. yine de burada sahip olduğu tek sorun olduğunu düşünmüyorum. Yorumunuza da aşağıda cevap verdi. – dove

0

Hata ayıklama için programatik denetim sağlayacak ve gerektiğinde ayarlanacak çıkış önbelleği için bir filtre kullanıyorum. Burada ayarlama Ben sadece çok statik kısmı için şimdiye kadar bu kullanıyorum ben (aynı zamanda daha önceki önbelleğe alma temizlenir emin olun) düşündüğünüz farkı

public class CacheFilterAttribute : ActionFilterAttribute 
    { 
     private const int Second = 1; 
     private const int Minute = 60 * Second; 
     private const int Hour = 60 * Minute; 
     public const int SecondsInDay = Hour * 24; 


     /// <summary> 
     /// Gets or sets the cache duration in seconds. The default is 10 seconds. 
     /// </summary> 
     /// <value>The cache duration in seconds.</value> 
     public int Duration 
     { 
      get; 
      set; 
     } 

     public int DurationInDays 
     { 
      get { return Duration/SecondsInDay; } 
      set { Duration = value * SecondsInDay; } 
     } 

     public CacheFilterAttribute() 
     { 
      Duration = 10; 
     } 

     public override void OnActionExecuted(ActionExecutedContext filterContext) 
     { 
      if (Duration <= 0) return; 

      HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache; 
      TimeSpan cacheDuration = TimeSpan.FromSeconds(Duration); 

      cache.SetCacheability(HttpCacheability.Public); 
      cache.SetExpires(DateTime.Now.Add(cacheDuration)); 
      cache.SetMaxAge(cacheDuration); 
      cache.AppendCacheExtension("must-revalidate, proxy-revalidate"); 
     } 
    } 

kılacak eğer bu kullanmak ve görmek için çekinmeyin bir sitenin, bu yüzden sağlayabilir, bu

[CacheFilter(DurationInDays = 1)] 

gibi bir çağrı Açıkçası sadece bu VaryByParams bir özellik olarak ortaya olmasını uzatmak istiyorum ama ne yapacağını bilirdin gibi geliyor.

+0

Niçin burada, neden kendi Özniteliğinizi oluşturuyorsunuz? –

+0

Birkaç görüşe başvurdum ve daha fazlasını yapacağım. Yukarıda gördüğünüz kesin ayarlarda% 100 değildim ve bu sayede kolayca değiştirebiliyorum ve her yerde uygulandığını biliyorum.Önbelleği ayarlarken daha fazla başlık eklenip eklenmeyeceğine hala karar veremiyorum. Elbette bunun kötü bir fikir olduğunu bulursam, bunu OutputCache özniteliğinin temiz bir uzantısı haline getirebilir ve hiçbir şey kaybetmez. Kısacası, herhangi bir risk ortaya çıktığında güvenli bir şekilde açık bir yolla kazanacak bir şeyimiz vardı. – dove

+0

Burada yaptıklarıyla ilgili yanlış bir şey yok, ancak sorunuza cevap vermiyor. Oluşturduğu filtre, tarayıcı önbelleğe alma değil, * tarayıcı * önbelleğini etkiler. Bu yapmak için meşru ve bunu yapan ASP.NET MVC içine inşa edilmiş bir şey farkında değilim. Aynı zamanda, dolaylı olarak, iyi bir noktaya işaret eder, ki burada oyunda iki farklı önbellek vardır, tarayıcıdaki ve sunucudakilerden biri. Firebug veya Fiddler ile kontrol etmek iyi olsa da, sorunuzu sunucu önbelleği ile ilgili olarak görüyorum. –