2011-02-04 25 views
5

Bir web sitesi için YALNIZCA kimlik doğrulaması olmayan kullanıcılar için sayfaları önbelleğe almak istiyorum - kimliği doğrulanmış kullanıcılar önbelleğe alınmış içerik almazlar (güncelleştirilecek ve sonuçları doğru görmeleri gerektiğinden uzakta). Link1 Link2Yalnızca kimliği doğrulanmamış kullanıcılar için önbelleğe alma

... Ama doğrulanmış kullanıcılar için tamamen önbelleğe alma özelliğini kapatmak için anlamaya olamaz:

Ben VaryByCustom kullanarak her kullanıcı için önbelleği değişir biliyorum.

Ne yapmalı?

Düzenleme

zaten doğrulanmamış kullanıcıdan sayfanın önbelleğe alınmış bir sürümü olup olmadığını aşağıdaki kod bir sorunu var. Temel olarak kimliği doğrulanmış kullanıcıya, işlerin kimliği doğrulanmamış görüntüsüne hizmet verilecektir. (Eğer önbelleğe yerde) Link

+0

kullanıcı kimlik doğrulaması kontrol edin ve özel önbellek özelliğini oluşturmanın bazı mantık (cache veya önbelleğe çıkışı) yaptıktan sonra. –

+0

Kulağa hoş geliyor, RoBYCoNTe. Bir cevap olarak yazmalısın, böylece insanlar bunun için oy verebilir. :) – Kjensen

cevap

0

Sen (önbelleği yok) iki denetleyicileri, kimliği doğrulanmış kullanıcılar için bir, sigara doğrulanmış kullanıcılar için bir tane oluşturmak isteyebilirsiniz:

Ancak bu bağlantı burada çalışan çözümü vardır . Daha sonra, kontrol cihazlarındaki mantığı, DRY ve üniteyi test edilebilir kodunuza uydurmak için ortak bir "iş katmanı nesnesi" haline getirebilirsiniz. ilham alan

+0

Bunu yapmanın bir yolu, ama daha iyi bir yol olmalı. – Kjensen

2

Link1 kolay kod fikri şu şekilde GetVaryByCustomString geçersiz kılma çıkışını değiştirebildiği şekilde olduğu gibi, yayınladı: teknik doğrulanmış olarak

public override string GetVaryByCustomString(HttpContext context, string arg) 
{ 
    if (arg == "IsLoggedIn") 
    { 
     if (context.Request.Cookies["anon"] != null) 
     { 
      if (context.Request.Cookies["anon"].Value == "false") 
      { 
       return "auth"; 
      } 
     } 
     return Guid.New().ToString(); 
    } 
    else 
    { 
     return base.GetVaryByCustomString(context, arg); 
    } 
} 

Bu gerçekten bir cevap değil Kullanıcının çıktısı hala önbelleğe alınacak, ancak kimliği doğrulanmış kullanıcıların sonuçların hemen ne olduğunu görmesi şartını yerine getiriyor. Dezavantajı, önbellek süresini/TTL'yi yeterince küçük tutmanız gerekecek, böylece önbelleğiniz su basmayacak ancak anonim kullanıcıların bundan biraz daha fazla yarar sağlayabilecekleri kadar büyük olmanız.

Başka bir alternatif, önbelleğe almak için kendi Eylem Filtrenizi yazmak ve yalnızca anonim olarak önbelleğe almak için destek eklemektir. Bu olsa da, 'kendi' toprağınızı yuvarlamada çok daha fazlası var. Başlangıç ​​noktası için bkz. Klopfenstein's old post veya Steve Sanderson's. Bunlar, OutputCache'in diğer özelliklerinin çoğundan yoksundur (örneğin tüm rota verilerinde anahtarlar), ancak kendi özelliklerinize göre çalışabilirsiniz.

5

Bunu genel eylem filtresi olarak kullanın.

public class NoCacheForAuthenticatedUsersAttribute: ActionFilterAttribute 
{ 
    public override void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
     if(filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     } 
    } 
} 
+1

Benim için çalışıyor görünmüyor. Sayfa, çıktı önbelleğine yerleştirildiğinde, özellik mantığı yürütülmez. –

+0

Belki de doğrulama geri çağrısı yok httpContext.Response.Cache.AddValidationCallback – qub1n

İlgili konular