2009-09-17 15 views
5

Próbuję użyć OutputCaching w mojej witrynie ASP.NET MVC. Problem polega na tym, że gdy próbuję zmienić wartość jednego z moich parametrów, zwraca dane dla pierwszego żądanego elementu!Buforowanie nie działa poprawnie na mojej stronie ASP.NET MVC?

Oto mój kod (z nazwiskami param zmienione) ...

[ApiAuthorize] 
[HandleErrorAsJson] 
public class SearchController : Controller 
{ 
    [AcceptVerbs(HttpVerbs.Get)] 
    [OutputCache(Duration = 60, VaryByParam = "*")] 
    public ActionResult ScoreCard(string foo, byte? bar, byte? pewpew) 
    { 
    .. 
    } 
} 
  • UWAGA 1: ApiAuthorize - atrybut niestandardowy, który sprawdza na param kwerendy o nazwie 'Klucz' i sprawdza in słowniku pamięci aby sprawdzić, czy istnieje.
  • UWAGA 2: HandleErrorAsJson - atrybut niestandardowy, który zwraca komunikat o błędzie jako json, jeśli wyjątek został/zostanie zgłoszony.

a oto dwie rozmowy Przykładowe robię do tej akcji: -

więc dane z pierwszej rozmowy (foo = cześć świat, Pew Pew) jest zwracany jako 200 OK. Następnie drugie wywołanie api zwraca wartość 200 OK, ale dane z poprzedniego połączenia.

Ponadto nie używam żadnego serwera proxy. Jeśli skomentuję atrybut OutputCache, wszystko jest w porządku.

Próbowałem zostały również następujące (wykaz ręcznie za każdym razem muszę cache) .....

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

Nie traf :(

Wskazówki, jak muszę się upewnić, że włącz klucz API "Klucz" jako część klucza unikalnego w pamięci podręcznej. Nie chcę, aby ludzie szukali tego samego, ale jeśli druga osoba nie ma odpowiedniego klucza, nie powinni otrzymywać wyników z pamięci podręcznej , ale komunikat o błędzie (z technicznego punktu widzenia jest to 401 nieautoryzowane, ale tak czy inaczej) ...

Ty ghts?

Odpowiedz

4

Lista parametrów w VaryByParam ma być rozdzielana średnikami, a nie rozdzielana przecinkami. Spróbuj. Powiedział, że * powinien zadziałać.

+0

+1 bardziej bezpośrednio koncentruje się na pytaniu w zasięgu ręki. chociaż nie sądzę, że to jedyny problem, jaki ma tutaj. odpowiedział również na twój komentarz poniżej. – dove

0

Używam filtra do buforowania wyjściowego, który zapewni programową kontrolę do debugowania, a także zostanie ustawiony, gdy zajdzie taka potrzeba. Poczuj się to wykorzystać i sprawdzić, czy ustawienie go tutaj by dokonać zmian, które myślę, że może to (również upewnić się wszystkie poprzednie cache jest czyszczony)

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"); 
     } 
    } 

jestem po prostu za pomocą tego do tej pory za bardzo statycznej części darmo witryny, tak jak ma to wezwanie

[CacheFilter(DurationInDays = 1)] 

Oczywiście chcesz po prostu przedłużyć to mieć VaryByParams wystawiony jako właściwość, mogą dostarczyć ale brzmi jak chcesz wiedzieć, co robić.

+0

Ciekawe, dlaczego stworzyłeś własny atrybut, tutaj? –

+0

Zaaplikowałem na kilka widoków i zrobię więcej. Nie byłem w 100% na dokładnych ustawieniach, które widzisz powyżej, więc z łatwością mogłem to poprawić i wiedziałem, że zostało zastosowane wszędzie.Nadal nie ustalam, czy dodać więcej nagłówków podczas ustawiania pamięci podręcznej. Oczywiście, jeśli uzna to za zły pomysł, mogę uczynić to czystym rozszerzeniem atrybutu OutputCache i nic nie stracić. Krótko mówiąc, miał coś do zyskania z jasną ścieżką do bezpieczeństwa, jeśli pojawi się jakiekolwiek ryzyko. – dove

+0

Nie ma nic złego w tym, co zrobił tutaj, ale to nie odpowiada na twoje pytanie. Filtr, który utworzył, wpływa na buforowanie * przeglądarki *, a nie na buforowanie serwera. Jest to uzasadnione i nie jestem świadomy niczego wbudowanego w ASP.NET MVC, który to robi. To również, niejawnie, czyni dobry punkt, który polega na tym, że są tu dwie różne pamięci podręczne, jedna w przeglądarce i jedna na serwerze. Twoje pytanie wydaje mi się związane z pamięcią podręczną serwera, chociaż dobrze byłoby sprawdzić to w Firebug lub Fiddler. –

Powiązane problemy