it-swarm.com.de

Deaktivieren Sie den Browser-Cache für die gesamte ASP.NET-Website

Ich suche nach einer Methode zum Deaktivieren des Browsercaches für eine gesamte ASP.NET MVC-Website

Ich habe folgende Methode gefunden:

Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);
Response.Cache.SetNoStore();

Und auch eine Meta-Tag-Methode (das funktioniert bei mir nicht, da einige MVC-Aktionen teilweise HTML/JSON über Ajax senden, ohne einen Kopf, ein Meta-Tag).

<meta http-equiv="PRAGMA" content="NO-CACHE">

Ich suche jedoch nach einer einfachen Methode, um den Browser-Cache für eine gesamte Website zu deaktivieren.

199
Palani
HttpContext.Current.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
HttpContext.Current.Response.Cache.SetValidUntilExpires(false);
HttpContext.Current.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
HttpContext.Current.Response.Cache.SetNoStore();

Alle Anfragen werden zuerst über default.aspx weitergeleitet - vorausgesetzt, Sie können einfach den Code dahinter einfügen.

92
Squiggs.

Erstellen Sie eine Klasse, die von IActionFilter erbt.

public class NoCacheAttribute : ActionFilterAttribute
{  
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
        filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false);
        filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
        filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        filterContext.HttpContext.Response.Cache.SetNoStore();

        base.OnResultExecuting(filterContext);
    }
}

Dann setzen Sie Attribute wo nötig ...

[NoCache]
[HandleError]
public class AccountController : Controller
{
    [NoCache]
    [Authorize]
    public ActionResult ChangePassword()
    {
        return View();
    }
}
365
JKG

Verwenden Sie einfach das, was für Sie bereitgestellt wird, anstatt Ihr eigenes zu rollen.

Deaktivieren Sie, wie bereits erwähnt, das Caching nicht für alle Elemente. Beispielsweise sollten in ASP.NET MVC häufig verwendete jQuery-Skripts zwischengespeichert werden. Eigentlich sollten Sie idealerweise ein CDN für diese verwenden, aber meiner Meinung nach sollten einige Inhalte zwischengespeichert werden.

Was ich hier am besten finde, anstatt den [OutputCache] überall zu streuen, ist die Verwendung einer Klasse:

[System.Web.Mvc.OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public class NoCacheController  : Controller
{
}

Alle Controller, für die Sie das Caching deaktivieren möchten, erben dann von diesem Controller.

Wenn Sie die Standardeinstellungen in der NoCacheController-Klasse überschreiben müssen, geben Sie einfach die Cache-Einstellungen für Ihre Aktionsmethode an. Die Einstellungen für Ihre Aktionsmethode haben Vorrang.

[HttpGet]
[OutputCache(NoStore = true, Duration = 60, VaryByParam = "*")]
public ViewResult Index()
{
  ...
}
132

Möglicherweise möchten Sie das Browser-Caching für alle von Controllern gerenderten Seiten deaktivieren (d. H. HTML-Seiten), aber Caching beibehalten für Ressourcen wie Skripte, Stylesheets und Bilder. Wenn Sie die MVC4 + -Bündelung und -minimierung verwenden, möchten Sie die Standard-Cache-Dauer für Skripte und Stylesheets beibehalten (sehr lange Dauer, da der Cache aufgrund einer Änderung an einer eindeutigen URL ungültig wird, nicht aufgrund der Zeit).

Fügen Sie in MVC4 + Folgendes zu FilterConfig.RegisterGlobalFilters Hinzu, um das Browser-Caching auf allen Controllern zu deaktivieren, es jedoch für alle anderen Objekte beizubehalten, die nicht von einem Controller bedient werden:

filters.Add(new DisableCache());

Definieren Sie DisableCache wie folgt:

class DisableCache : ActionFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    }
}
10
Edward Brey

Ich weiß, dass diese Antwort nicht zu 100% mit der Frage zusammenhängt, aber es könnte jemandem helfen.

Wenn Sie den Browser-Cache für die gesamte ASP.NET MVC-Website deaktivieren möchten, dies aber nur VORÜBERGEHEND tun möchten, ist es besser, den Cache in Ihrem Browser zu deaktivieren.

Here's a screenshot in Chrome

6

Ich habe alle vorherigen Antworten implementiert und hatte immer noch eine Ansicht, die nicht richtig funktionierte.

Es stellte sich heraus, dass der Name der Ansicht, mit der ich das Problem hatte, "Zuletzt verwendet" lautete. Offensichtlich hat dies den Internet Explorer verwirrt.

Nachdem ich den Namen der Ansicht (im Controller) in einen anderen Namen geändert hatte (ich habe 'Recent5' gewählt), begannen die obigen Lösungen zu funktionieren.

2
DrHooverCraft

Sie können den folgenden Code in der Datei Global.asax ausprobieren.

protected void Application_BeginRequest()
    {
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
        Response.Cache.SetNoStore();
    }
0
NidhinSPradeep