Frage

Ich habe einen benutzerdefinierten handler, das ist wieder ein Bild an den browser.

Die Bilder abgerufen werden, die aus einer Datenbank.

Für einige Grund, die Bilder sind nicht vom browser zwischengespeichert, und ich Frage mich, wenn jemand könnte in der Lage sein, zu erkennen, was ich bin fehlt der code unten:

HttpContext.Current.Response.BinaryWrite(imageBytes);
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.Public);
Context.Current.Response.Cache.SetAllowResponseInBrowserHistory(true);
if(imgRepGetCache.DateCached.HasValue)
    HttpContext.Current.Response.Cache.SetLastModified(imgRepGetCache.DateCached.Value);
HttpContext.Current.Response.Cache.SetExpires(DateTime.Now.AddDays(2));
HttpContext.Current.Response.ContentType = "image/jpeg";

Oder alternativ, wenn ich bin völlig fehlt der Punkt, irgendwie, und es ist woanders ich sehen müssen.

Edit: Wie pro Antrag für mehr Infos:

  • Die URL ist immer das gleiche
  • Ich Teste laden die gleiche Datei über den standard-IIS-Rohr, und mein Rohr in demselben browser auf demselben PC.Die eine, die Belastungen durch IIS normalerweise zwischengespeichert, meine Datei nicht.

Edit 2: Nach der Besichtigung der HTTP-Anforderungen/ - Antworten auf den normalen IIS route ich denke, es hat etwas zu tun mit der ETag.Der ETag (das hab ich neu, wie gerade jetzt), scheint es eine Art Prüfsumme für das Dokument.Bei nachfolgenden Anfragen, die ein browser ETag gesendet, und wenn der server findet die ETag nicht geändert hat, dann gibt es eine 304 - Not Modified.Alles gut!Aber ich bin jetzt die ETag verwenden:

HttpContext.Current.Response.Cache.SetETag(imgRepGetCache.DateCached.ToString());

Aber es erscheint nicht in der Antwort.Näher...

Edit 3: Ich befestigte ihn am Ende nach der Einnahme von Vorteil Firebug für einige HTTP-Inspektion Spaß.Ich habe meine Lösung unten.

War es hilfreich?

Lösung

OK, I fixed it.

Hier ist was ich getan habe, für jemand anderes für meine eigene zukünftige Referenz:

// Check for repeated request for the same image from a browser
if (HttpContext.Current.Request.Headers.Get("If-None-Match") == imgRepGetCache.DateCached.Value.ToString())
{
    // Return 304 - Not Modified
    HttpContext.Current.Response.Status = "304 Not Modified";
}
else
{
    if (imgRepGetCache.DateCached.HasValue)
        HttpContext.Current.Response.Headers.Set("Etag", imgRepGetCache.DateCached.Value.ToString());
    // ... do my other stuff here
}

Funktioniert wunderbar!

Wenn jemand Flecken mögliche Probleme hier, lassen Sie mich wissen, so kann ich aktualisieren diese.

To pre-empt ein offensichtlicher - kann ich zu 100% verlassen sich auf die Datums-Zeichenfolge zur Identifizierung, ob ein Bild neu oder nicht (in meinem speziellen Szenario).

Andere Tipps

Sie nicht noch etwas in Ihrem Beitrag über es, aber ist das ein https:// Ihre Adresse?Browser nicht cache-Bilder und Seiten von https-Seiten, die aus Sicherheitsgründen.

Die Dinge, die Sie brauchen, um über die generation, die Antwort sind:

  • ETag
  • Ablauf

Die Dinge, die Sie brauchen zu befürchten, wenn eine Anforderung erhalten, sind:

  • Last-Modified
  • If-Match
  • If-None-Match
  • If-Modified-Since
  • If-Unmodified-Since
  • Es Sei Denn-Modified-Since

Möglicherweise müssen Sie auch die sorgen über den folgenden http-Methoden:

  • HOLEN Sie sich
  • KOPF

Hier ist eine Lösung, die sollte ziemlich einfach sein, um refactor, um suite Ihre Bedürfnisse:http://code.google.com/p/talifun-web/wiki/StaticFileHandler

Es liest Dateien aus dem Dateisystem und legt Sie in einem cache im Arbeitsspeicher, so ändere es einfach zu Lesen aus der Datenbank.Sollte einfach sein job.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top