2009-09-17 9 views
5

Ich versuche, OutputCaching in meiner ASP.NET MVC-Website zu verwenden. Problem ist, wenn ich versuche, den Wert von einem my querystring params zu ändern, gibt es die Daten für das erste Element zurück, das angefordert wurde!Caching funktioniert nicht richtig in meiner ASP.NET MVC-Website?

Hier ist mein Code (mit den param Namen geändert) ...

[ApiAuthorize] 
[HandleErrorAsJson] 
public class SearchController : Controller 
{ 
    [AcceptVerbs(HttpVerbs.Get)] 
    [OutputCache(Duration = 60, VaryByParam = "*")] 
    public ActionResult ScoreCard(string foo, byte? bar, byte? pewpew) 
    { 
    .. 
    } 
} 
  • Anmerkung 1: ApiAuthorize - benutzerdefinierte Attribute, die für einen Abfragezeichenfolgeflag param genannten 'Key' überprüft und überprüft ein im Speicher-Wörterbuch, um zu sehen, ob es existiert.
  • HINWEIS 2: HandleErrorAsJson - benutzerdefiniertes Attribut, das die Fehlermeldung als json zurückgibt, wenn eine Ausnahme ausgelöst wurde/wird.

und hier zwei Beispiel Anrufe i auf diese Aktion zu machen bin: -

so die Daten aus dem ersten Aufruf (foo = Hallo Welt, Pew Pew) wird als 200 OK zurückgegeben. Dann gibt der zweite api-Anruf eine 200 OK zurück, aber mit den Daten des vorherigen Anrufs.

Außerdem verwende ich keinen Proxy-Server. Wenn ich das OutputCache-Attribut auskommentiere, ist alles gut.

Ich habe auch versucht die folgenden (manuell jedes Mal, wenn ich in den Cache benötigen Auflistung) .....

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

Kein Glück :(

Beachten Sie, wie ich sicher machen müssen, dass i Fügen Sie den API-Parameter 'Key' als Teil des eindeutigen Cache-Schlüssels hinzu. Ich möchte nicht, dass Benutzer dasselbe suchen, aber wenn die zweite Person nicht den richtigen Schlüssel hat, sollten sie kein zwischengespeichertes Ergebnis erhalten , aber eine Fehlermeldung (technisch ist es eine 401 nicht autorisierte, aber sowieso) ...

Thou ghts?

Antwort

4

Die Liste der Parameter in VaryByParam soll durch Semikolon getrennt sein, nicht durch Kommas getrennt. Probieren Sie es aus. Das heißt, das * hätte funktionieren sollen.

+0

+1 mehr direkt auf die Frage in der Nähe konzentriert. obwohl ich nicht denke, dass es das einzige Problem ist, das er hier hat. antwortete auf deinen Kommentar unten auch. – dove

0

Ich benutze einen Filter für die Ausgabe-Caching, die programmatische Kontrolle für das Debuggen geben wird und auch einstellen wird, wenn es sein muss. Fühlen Sie sich frei, diese zu verwenden und sehen, ob es hier einstellen würde den Unterschied machen, die ich denke, es könnte (auch sicherstellen, dass alle vorherigen Cache gelöscht wird)

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

Ich verwende nur die bisher für einen sehr statischen Teil einer Website, haben so ein Ruf wie diese bieten

[CacheFilter(DurationInDays = 1)] 

Offensichtlich gerade diese VaryByParams ausgesetzt erweitern Sie möchten, als eine Eigenschaft zu haben, aber klingt wie Sie wissen würde, was zu tun ist.

+0

Aus Interesse, warum hast du dein eigenes Attribut hier erstellt? –

+0

Ich habe mich auf ein paar Ansichten beworben und werde mehr tun. Ich war nicht 100% auf genaue Einstellungen, die Sie oben sehen und so mit diesem konnte ich leicht zwicken und wissen, dass es überall angewendet wurde.Ich bin immer noch nicht festgelegt, ob beim Einstellen des Caches mehr Header hinzugefügt werden. Natürlich, wenn ich finde, dass dies eine schlechte Idee ist, kann ich dies zu einer sauberen Erweiterung des OutputCache-Attributs machen und nichts verlieren. Kurz gesagt, hatte etwas zu gewinnen mit einem klaren Weg in die Sicherheit, wenn irgendein Risiko aufkam. – dove

+0

Es ist nichts falsch daran, was er hier getan hat, aber es beantwortet deine Frage nicht. Der Filter, den er erstellt hat, wirkt sich auf das * browser * -Caching aus, nicht auf das Server-Caching. Das ist legitim zu tun, und mir ist nichts bekannt, was in ASP.NET MVC eingebaut ist. Es macht implizit auch einen guten Punkt, nämlich dass hier zwei verschiedene Caches im Spiel sind, der eine im Browser und der andere im Server. Ihre Frage scheint mir mit dem Server-Cache verbunden zu sein, obwohl es gut wäre, dies mit Firebug oder Fiddler zu überprüfen. –