2014-05-21 12 views
5

Przedstaw problemSkonfiguruj MVC.NET OutputCache powrotu 304 Not Modified jeśli ActionResult nie zmieniła

powodzeniem skonfigurowana pamięć podręczną przeglądarki, aby powrócić zapisaną odpowiedź, jeśli serwer wskazuje 304 Not Modified. Oto config:

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

web.config jest doskonały i ustawia Cache-control:private, max-age=0 tak, że:

  1. Przeglądarka będzie buforować odpowiedzi,
  2. będzie zawsze walidacji cache, a
  3. zwróci buforowaną odpowiedź, jeśli serwer odpowie 304.

Problemem jest to, że nasze działania zawsze reagować MVC.NET 200 i nigdy 304.

Problem

Jak możemy skonfigurować buforowanie wyjścia do zwróci 304 Not Modified gdy ActionResult nie zmienił?

  • Czy istnieje jakieś wbudowane sprawdzanie poprawności pamięci podręcznej w MVC.NET?
  • Jeśli tak nie jest, w jaki sposób możemy uruchomić nasz mechanizm sprawdzania pamięci podręcznej?

Rzut na miarę będzie prawdopodobnie wymagał filtra akcji z ETag lub Last-Modified.

Screen Shots

Oto zrzut ekranu pokazujący Skrzypek na brak 304.

  • 318 jest SHIFT + Refresh.

  • 332 to odświeżenie, którego oczekiwaliśmy, spowoduje 304. Problem.

Fiddler Web Debugger

Search and Research

ASP.NET MVC : how do I return 304 "Not Modified" status? wspomina powrocie do 304 z poziomu działania. Nie zapewnia to sposobu, aby OutputCache dokładnie odpowiadał za pomocą 304.

Working with the Output Cache and other Action Filters pokazuje, jak zastąpić OnResultExecuted, co pozwoli na dodawanie/usuwanie nagłówków.

+1

Prawdopodobnie oznaczało # 332 ... – haim770

Odpowiedz

4

Następujące działa dla nas.

Web.Config

Set Cache-Control:private,max-age-0 aby włączyć buforowanie i wymusić ponowną weryfikację.

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

Action

odpowie 304, jeżeli odpowiedź nie jest modyfikowany.

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

Filtr

Usuń Cache-Control:private,max-age-0 inaczej pamięć podręczna przechowuje komunikat o stanie.

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

Skrzypek pokazuje, że pamięć podręczna działa prawidłowo.

Successful Fiddler

Powiązane problemy