2011-08-17 9 views
19

Zbudowałem aplikację MVC3, aplikacja ma wiele stron, teraz, ponieważ problemy z bezpieczeństwem muszę dodać do konfiguracji bez pamięci podręcznej w nagłówkach HTTP, jest łatwiejszy sposób to zrobić? jeśli możemy zmodyfikować jedno miejsce, to będzie działać dla całej aplikacji, będzie idealnie.Jak dodać nagłówki bez pamięci podręcznej dla całej witryny do aplikacji MVC 3

Czy możecie mi pomóc?

+0

Mam edytowane moją odpowiedź do używania 'Response.Cache.SetCacheability()' metoda zamiast ustawiać nagłówki ręcznie. Testowane w Fiddler i działa zgodnie z oczekiwaniami. – Marko

Odpowiedz

29

Jak o ustawieniu nagłówki wewnątrz przypadku Application_PreSendRequestHeaders w Global.asax?

EDIT Można użyć Response.Cache.SetCacheability zamiast ustawiania nagłówki bezpośrednio. *

void Application_PreSendRequestHeaders(Object sender, EventArgs e) 
{ 
    Response.Cache.SetCacheability(HttpCacheability.NoCache); 
} 

Testowane Skrzypek.


alternatywny sposób ustawiając nagłówków ręcznie.

void Application_PreSendRequestHeaders(Object sender, EventArgs e) { 
    Response.Headers.Set("Cache-Control", "no-cache"); 
} 
+11

To jest WAY za dużo bez buforowania! Jeśli to zrobisz, nie będziesz cache'ować wszystkich javascript, css, ikon, itp. I zrobić całkiem sporo na przepustowości i szybkości reakcji. –

+0

@ScottStafford odczytać żądanie OP "jeśli możemy zmienić jedno miejsce, to będzie działać dla całej aplikacji, będzie idealnie." Oczywiście niektóre pliki mogą być filtrowane, ale nie jest to wymagane. – Marko

+3

Wiem, że to powiedział. Nie miałem ani jednego, ani nic, ale chciałem się upewnić, że on (i wszyscy inni czytelnicy) wiedzieli, jakie były konsekwencje takiego podejścia. Wrzuć test "jest to plik aspx" i jest on dużo szerszy. –

1

zrobiłbym to w samej IIS (zakładając że używasz) lub web.config:

<configuration> 
    <system.webServer> 
     <staticContent> 
     <clientCache cacheControlMode="DisableCache" /> 
     </staticContent> 
    </system.webServer> 
</configuration> 

Mniej kod jest lepszy kod.

Konfiguracja różni się nieco w zależności od wersji IIS.

Aby uzyskać więcej informacji, patrz here.

+0

Czy ta konfiguracja dotyczy tylko zawartości statycznej (img, js, css itp.), Czy nazwa jest po prostu trochę myląca? Z witryny IIS nie wynika jasno. –

+0

@ Troy - * myślę, że to wszystko. Dość łatwe do przetestowania, wystarczy sprawdzić nagłówki odpowiedzi w skrzypce/firebug/etc. – RPM1984

+2

Kontrolowanie pamięci podręcznej z aplikacji wydaje się bardziej odpowiednie dla mnie, ponieważ oczekuję, że większość ludzi będzie chciała buforować zawartość statyczną. Ponadto, nie powiedziałbym, że twoje rozwiązanie wymaga mniejszego kodu :-). – theDmi

1

Zalecam, aby połączenia te były ograniczone do żądań innych niż GET, aby uniknąć utraty korzyści z pamięci podręcznej w GET. Poniższe zapewnia, że ​​nawet agresywne przeglądarki buforujące, takie jak iOS 6 Safari, nie będą buforować niczego, co nie jest żądaniem GET.

Używam klasy bazowej kontrolera, z której wszystkie moje kontrolery dziedziczą z wielu powodów, a to dobrze sprawdziło się w tym, że moje przesłonięcie inicjowania może obsłużyć warunkowo moje nagłówki buforowania.

public class SmartController : Controller 
{ 
    ... 
    public HttpContextBase Context { get; set; } 

    protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
    { 
     Context = requestContext.HttpContext; 

     if (Context.Request.RequestType != "GET") 
     { 
      Context.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     } 

     base.Initialize(requestContext); 
     ... 
    } 
... 
} 
+0

Ustawienie zasad pamięci podręcznej na podstawie czasownika HTTP nie będzie wystarczające dla szerokiej gamy aplikacji. Powiedzmy, że masz stronę, na której używasz GET i querystring do ładowania danych pacjentów szpitala? Nie chcesz, aby strona była buforowana. –

+0

Larry, w takim przypadku na pewno nie chciałbyś wdrożyć logiki sterownika bazy, tak jak sugerowałem tutaj. :) –

13

alternatywą dla tych, którzy chcą metody/działania lub klasy/kontrolera szerokiej no-cache

[OutputCache(Location = OutputCacheLocation.None)] 
public class HomeController : Controller 
{ 
... 
} 

Jak wyjaśniono tutaj:

OutputCacheLocation Enumeration

Brak: Bufor wyjściowy jest wyłączony dla żądana strona. Ta wartość odpowiada wartości wyliczeniowej HttpCacheability.NoCache.

HttpCacheability Enumeration

nocache - Ustawia Cache-Control: no-cache nagłówek ....

+0

Bufor wyjściowy ASP.NET nie jest tym samym, co nagłówkiem HTTP bez bufora, o który pyta OP. –

+0

@MikeMarynowski tak, ale jesteś pewien? Wierzę, że None nie oznacza ani serwera, ani klienta, i generuje nagłówek "Cache-Control: no-cache" dla klienta – KCD

+0

["None: \t Bufor wyjściowy jest wyłączony dla żądanej strony. Ta wartość odpowiada wartości wyliczeniowej HttpCacheability.NoCache . "(http://msdn.microsoft.com/en-us/library/system.web.ui.outputcachelocation (v = vs.100) .aspx) ... [" NoCache - Ustawia Cache-Control: no-cache header .... "] (http://msdn.microsoft.com/en-us/library/system.web.httpcacheability (v = vs.100) .aspx) – KCD

2

Skonfiguruj filtr globalny.

public class MvcApplication : System.Web.HttpApplication 
{ 

    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new NoCacheGlobalActionFilter()); 
    }  
} 

public class NoCacheGlobalActionFilter : ActionFilterAttribute 
{ 
    public override void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
     HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache; 
     cache.SetCacheability(HttpCacheability.NoCache); 

     base.OnResultExecuted(filterContext); 
    } 
} 

http://dotnet.dzone.com/articles/output-caching-aspnet-mvc

Powiązane problemy