2012-03-28 3 views
6

Есть ли способ использовать OutputCache атрибут кэширования результатов только зарегистрированным пользователям и переоценивать для зарегистрированных пользователей в примере:OutputCache mvc3 только логаут кэширование пользователя

что я хотел бы

[OutputCache(onlycacheanon = true)] 
public ActionResult GetPhoto(id){ 
    var photo = getPhoto(id); 
    if(!photo.issecured){ 
     return photo... 
    } 
    return getPhotoOnlyIfCurrentUserHasAccess(id); 
    //otherwise return default photo so please don't cache me 
} 

ответ

8

Вы можете использовать VaryByCustom Недвижимость в [OutputCache].

Затем переопределить HttpApplication.GetVaryByCustomString и проверить HttpContext.Current.User.IsAuthenticated.

  • Возвращение "NotAuthed" или аналогичный, если не прошел проверку подлинности (активируя кэш)
  • Guid.NewGuid().ToString() недействительными кэшированные
+1

Это именно то, что я пропускал спасибо. Я не понял нулевого кэширования отключений. – maxfridbe

+0

Не знал, что он был доступен. Спасибо :) –

+0

@maxfridbe: Не забудьте принять ответ. – jgauffin

4

Это, как я реализовал выше.

В Global.asax.cs:

public override string GetVaryByCustomString(HttpContext context, string custom) 
{ 
    if (custom == "UserId") 
    { 
     if (context.Request.IsAuthenticated) 
     { 
      return context.User.Identity.Name; 
     } 
     return null; 
    } 

    return base.GetVaryByCustomString(context, custom); 
} 

Использование в кэш вывода атрибутов:

[OutputCache(Duration = 30, VaryByCustom = "UserId" ... 
public ActionResult MyController() 
{ 
    ...