2014-05-21 9 views
5

das Problem Einführungdie MVC.NET Output konfigurieren 304 zurückzukehren Geändert Nicht, wenn ein Action nicht geändert hat

Wir haben erfolgreich den Browser-Cache konfiguriert haben eine gespeicherte Antwort zurück, wenn der Server 304 Not Modified anzeigt. Hier ist die config:

<caching> 
    <outputCacheSettings> 
    <outputCacheProfiles> 
     <add 
     name="TransparentClient" 
     location="Client" 
     duration="0" /> 
    </outputCacheProfiles> 
    </outputCacheSettings> 
</caching> 

Die web.config ist perfekt und setzt Cache-control:private, max-age=0 so dass:

  1. Der Browser wird Antworten cachen,
  2. wird immer den Cache validieren und
  3. wird die zwischengespeicherte Antwort zurückgeben, wenn der Server antwortet 304.

Das Problem ist, dass unsere MVC.NET Aktionen immer 200 reagieren und nie 304.

Das Problem

Wie konfigurieren wir die Ausgabezwischenspeicherung eines 304 nicht geändert zurückzukehren, wenn eine Action nicht geändert hat?

  • Gibt es eine integrierte Cache-Validierung in MVC.NET?
  • Wenn nicht, wie können wir unseren Cache-Validierungsmechanismus rollen?

Der Roll-Our-Own wird wahrscheinlich einen Action Filter mit ETag oder Last-Modified benötigen.

Screen Shots

Hier ist ein Screenshot Fiddler das Fehlen eines

  • 318 304. zeigt eine SHIFT + Refresh.

  • 332 ist ein Refresh, von dem wir erwarteten, dass es 304 ergeben würde. Problem.

Fiddler Web Debugger

Suche und Forschung

ASP.NET MVC : how do I return 304 "Not Modified" status? erwähnt einen 304 aus der Aktion zurück. Das bietet keine Möglichkeit, den OutputCache mit einem 304 genau reagieren zu lassen.

Working with the Output Cache and other Action Filters zeigt, wie OnResultExecuted überschrieben wird, das Hinzufügen/Entfernen von Headern zu ermöglichen.

+1

Sie wahrscheinlich gemeint # 332 ... – haim770

Antwort

4

Folgendes funktioniert bei uns.

Web.Config

Set Cache-Control:private,max-age-0 Caching und Kraft wieder Validierung zu ermöglichen.

<system.web> 
    <caching> 
    <outputCacheSettings> 
     <outputCacheProfiles> 
     <add name="TransparentClient" duration="0" location="Client" /> 
     </outputCacheProfiles> 
    </outputCacheSettings> 
    </caching> 
</system.web> 

Aktion

Respond mit 304, wenn die Antwort nicht geändert wird.

[MyOutputCache(CacheProfile="TransparentClient")] 
public ActionResult ValidateMe() 
{ 
    // check whether the response is modified 
    // replace this with some ETag or Last-Modified comparison 
    bool isModified = DateTime.Now.Second < 30; 

    if (isModified) 
    { 
     return View(); 
    } 
    else 
    { 
     return new HttpStatusCodeResult(304, "Not Modified"); 
    } 
} 

Filter

Entfernen der Cache-Control:private,max-age-0 sonst der Cache wird die Statusmeldung speichern.

public class MyOutputCache : OutputCacheAttribute 
{ 
    public override void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
     base.OnResultExecuted(filterContext); 
     if (filterContext.HttpContext.Response.StatusCode == 304) 
     { 
      // do not cache the 304 response     
      filterContext.HttpContext.Response.CacheControl = "";     
     } 
    } 
} 

Fidder

Fiedler zeigt, dass der Cache-Speicher in geeigneter Weise wirkt.

Successful Fiddler

Verwandte Themen