28 Stimmen

Cache-Control-Kopfzeilen in ASP.NET

Ich versuche, die cache-control-Header für eine Webanwendung zu setzen (und es scheint, dass ich dazu in der Lage bin), aber ich erhalte, was ich denke, sind seltsame Einträge in den Header-Antworten. Meine Implementierung ist wie folgt:

    protected override void OnLoad(EventArgs e)
    {
        // Set Cacheability...
        DateTime dt = DateTime.Now.AddMinutes(30);
        Response.Cache.SetExpires(dt);
        Response.Cache.SetMaxAge(new TimeSpan(dt.ToFileTime()));

        // Complete OnLoad...
        base.OnLoad(e);
    }

Und das zeigen die Kopfzeilenantworten:

-----
GET /Pages/Login.aspx HTTP/1.1
Host: localhost:1974
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
X-lori-time-1: 1244048076221
Cache-Control: max-age=0

HTTP/1.x 200 OK
Server: ASP.NET Development Server/8.0.0.0
Date: Wed, 03 Jun 2009 16:54:36 GMT
X-AspNet-Version: 2.0.50727
Content-Encoding: gzip
Cache-Control: private, max-age=31536000
Expires: Wed, 03 Jun 2009 17:24:36 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 6385
Connection: Close
-----
  1. Warum wird die Eigenschaft "Cache-Control" zweimal angezeigt?
  2. Brauche ich beide Eigenschaften "Cache-Control" und "Expires"?
  3. Ist "Page_Load" der beste Ort, um diesen Code zu platzieren?

Gracias.

23voto

BigBlondeViking Punkte 3763

Sie sollten auch diese Zeile hinzufügen, wenn Sie das Höchstalter so weit nach vorne setzen:

// Summary:
// Sets Cache-Control: public to specify that the response is cacheable
// by clients and shared (proxy) caches.    
Response.Cache.SetCacheability(HttpCacheability.Public);

Ich tue eine Menge Antwort Header Manipulation mit Dokumenten und Bildern aus einer Datei-Handler, die Anfragen für Dateien verarbeitet die in der DB gespeichert sind.

Abhängig von Ihrem Ziel können Sie wirklich zwingen die Browser den Cache fast alle Sie Seite für Tage lokal (wenn das ist, was u wollen/brauchen).

bearbeiten:

Ich glaube auch, dass Sie das Höchstalter falsch eingestellt haben...

Response.Cache.SetMaxAge(new TimeSpan(dt.Ticks - DateTime.Now.Ticks ));

diese Zeile ist auf 30 Minuten Cache-Zeit im lokalen Browser eingestellt [max-age=1800]

Was die 2x Cache Control Zeilen angeht... Sie sollten überprüfen, ob IIS so eingestellt ist, dass der Header automatisch hinzugefügt wird.

12voto

chris166 Punkte 4781

Ich sehe nicht, dass Cache-control zweimal vorkommt. Eines ist in der Anfrage, eines in der Antwort. Das eine in der Anfrage kommt wahrscheinlich daher, dass Sie im Browser die Tastenkombination Umschalt+F5 oder etwas Ähnliches gedrückt haben.

Zu Ihrer zweiten Frage: Das hängt davon ab, was Sie mit den Cache-Headern erreichen wollen.

Ich weiß nicht, was Sie mit dem Höchstalter erreichen wollten. Der Wert ist viel zu hoch, da Sie die DateTime fälschlicherweise in eine TimeSpan konvertiert haben. Warum verwenden Sie stattdessen nicht einfach TimeSpan.FromMinutes?

Das Laden der Seite ist in Ordnung. Normalerweise spiele ich dort selbst mit den HTTP-Headern herum.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X