2009-02-16 6 views
7

Ich möchte eine lange Ablaufzeit für bestimmte Elemente festlegen können, die ein Benutzer über GET-Anfrage herunterlädt.Wie funktioniert die Verwendung des Expires-Headers in ASP.NET MVC am besten?

Ich möchte sagen "das ist gut für 10 Minuten" (d. H. Ich möchte eine Expires-Kopfzeile für +10 Minuten festlegen). Die Anfragen sind HTML-Fragmente, die auf der Seite über AJAX angezeigt werden und für die Sitzung des Benutzers gut sind. Ich möchte nicht zurück zum Server gehen und eine 304 bekommen, wenn sie sie wieder brauchen - ich möchte, dass der Browser-Cache mir sofort den gleichen Gegenstand gibt.

Ich fand einen Artikel, der fast ein Jahr alt ist über MVC Action filter caching and compression. Dies erstellt einen benutzerdefinierten ActionFilter, um den Expiry-Header zu ändern. Ich benutze bereits den Kompressionsfilter, der für einige benutzerdefinierte css funktioniert, die ich erzeuge (94% Kompressionsrate!).

Ich habe zwei Hauptanliegen:

1) Muss ich wirklich diese Methode verwenden. Mir geht es gut, wenn ich es tue, aber gibt es wirklich keine Funktionalität in MVC oder die OutputCache-Funktionalität, um dies für mich zu tun? Im "traditionellen" ASP.NET habe ich den Expires-Header immer nur manuell gesetzt, aber das können wir nicht mehr tun - zumindest nicht im Controller.

2) Wenn ich diese Filtermethode verwende - wird es die OutputCache-Richtlinie überhaupt stören -, die ich in web.config steuern kann. Ich denke, dass die beiden sich gegenseitig ausschließen, und du würdest beides nicht wollen - aber ich bin mir nicht ganz sicher.

Antwort

3
  1. Nein, Sie nicht haben diese Methode zu verwenden. Ich denke jedoch, dass es wahrscheinlich die beste Methode ist, um zu wählen, weil es den Controller testbarer und weniger webbewusst macht. Die Alternative wäre, den Header manuell in der Steuerung wie folgt zu setzen:

    Response.AddHeader ("Läuft ab", "Do, 01 Dec 1994 16:00:00 GMT");

  2. Nun, das OutputCache-Attribut steuert, wenn die Aktion überhaupt ausgeführt wird, und wenn stattdessen zwischengespeicherte HTML zurückgegeben wird. Expires teilt dem Browser mit, wann der HTML-Code erneut abgerufen werden soll. Also würde ich sie nicht gegenseitig ausschließen nennen, aber sie sind sicherlich zwei Seiten derselben Medaille, und du hast recht damit, dass du nicht beide brauchen darfst. Ich würde vorschlagen, the HTTP spec zu überprüfen, um zu entscheiden, was am besten für Ihre Anwendung geeignet ist.

+0

@craig Dank für Ihre Eingabe. Ich denke, eine Faustregel in Bezug auf # 2 ist, dass, wenn die generierte Ansicht sehr einfach ist (d. h. kein Datenbankzugriff), das Ablaufen alles sein kann, was benötigt wird. Wenn zehn Webmethodenaufrufe erforderlich sind, sollten Sie OutputCache verwenden. Manchmal möchten Sie Köpfe UND Schwänze richtig :-) –

+3

Bedenken: Wenn 10 Personen (auf verschiedenen Computern) Ihre Seite jeweils 10 Mal anfordern, läuft die Aktion selbst ab, dh Ihre Aktion läuft 10 Mal und der Server verarbeitet 10 Anfragen. Caching allein bedeutet, dass Ihre Aktion einmal ausgeführt wird und der Server 100 Anforderungen verarbeitet. Verfall und gemeinsames Caching bedeutet, dass Ihre Aktion einmal ausgeführt wird und der Server 10 Anforderungen verarbeitet. –

2

Response.Expires Diese Eigenschaft gibt die Anzahl der Minuten, bevor eine Seite gecached im Browser gibt abläuft, dh. Wenn der Benutzer vor der angegebenen Anzahl von Minuten zur gleichen Seite zurückkehrt, wird die zwischengespeicherte Version der Seite angezeigt.

Response.ExpiresAbsolute Mit dieser Eigenschaft wir das Datum und/oder Uhrzeit an abläuft, welche Seite gecached im Browser einstellen.

http://forums.asp.net/t/1532229.aspx

0

Es klingt wie Sie nur vom Benutzer verändern müssen:

http://aspadvice.com/blogs/ssmith/archive/2007/10/29/VaryByCustom-Caching-By-User.aspx

[OutputCache(Duration="10", VaryByCustom="username")] 

Global.asax:

public override string GetVaryByCustomString(HttpContext context, string key) 
{ 
    switch(key) 
    { 
     case "username": 
      return context.User.Identity.Name; 

     // Other VaryByCustom strategy implementations can go here. 
    } 

    return string.Empty; 
} 
Verwandte Themen