Expire le cache de sortie ASP.Net MVC




asp.net-mvc caching (4)

il semble que le cache de sortie ne place rien dans HttpContent.Cache car quand je le traverse, la collection est vide:

For Each elem As DictionaryEntry In HttpContext.Cache
  HttpContext.Cache.Remove(elem.Key)
Next

Voici mon attribut d'action:

<OutputCache(Duration:=600, VaryByParam:="pagename")> _
Function Index(ByVal pagename As String) As ActionResult

J'utilise la balise outputcache standard dans mon application MVC qui fonctionne très bien mais j'ai besoin de la forcer à être vidée à certains moments. Comment puis-je y parvenir? La page qui est mise en cache est construite à partir d'une route très simple {Controller} / {PageName} - la plupart des pages ressemblent à ceci: / Pages / About-Us

Voici la balise de cache de sortie qui est en haut de ma page d'affichage .aspx juste pour être clair:

<@ OutputCache Duration="100" VaryByParam="None" %>

Donc, dans une autre action sur le même contrôleur où le contenu est mis à jour, j'ai besoin de vider ce cache, ou même tout - c'est une très petite application donc pas un gros problème pour vider tous les éléments en cache.


Answer #1

Faites attention à l'utilisation de "None" vs. "".

  • Si vous envoyez "" alors le HttpHeader for Vary n'est pas envoyé.
  • Si vous envoyez "None" alors le HttpHeader for Vary est envoyé.

J'ai utilisé Fiddler pour vérifier ce comportement.

Cela semble avoir un impact sur le fait que le navigateur revienne ou non sur le serveur pour vérifier la dernière version (causant un 304). Au moins dans Chrome, c'est le cas. Vous voulez utiliser Varies="" si vous êtes sûr de ne pas vouloir mettre à jour le fichier avant qu'il ait expiré.

Je recommande d'utiliser Varies="" comme je l'ai fait dans ce post . Pour mon fichier javascript, je ne veux pas que le navigateur revienne et fasse une autre requête Http jusqu'à ce qu'il ait expiré. 304 est inutile.


Answer #2

HttpResponse.RemoveOutputCacheItem() est probablement la méthode que vous voulez utiliser. Si vous pouvez déterminer le nom sous lequel les actions sont mises en cache, vous pouvez supprimer uniquement l'action spécifique (essayez de définir un point d'arrêt ou de vider tous les noms des éléments mis en cache à l'écran)

Sinon, je passerais en revue l'ensemble du cache de sortie et effacez chaque élément.


Answer #3

Ne connaissant pas la différence entre "None" et "" pour le VaryByParam, j'utilisais cet attribut:

[OutputCache(Location=OutputCacheLocation.ServerAndClient, Duration=int.MaxValue, VaryByParam="none")]

Et ce code pour "réparer" le problème Vary: * :

this.Response.Cache.SetOmitVaryStar(true);

Ce que j'ai trouvé référencé lors des tests de mise en cache ASP.NET trouve un bug avec VaryByParam

La différence entre une directive OutputCache définie sur "Client" et "ServerAndClient" est que "ServerAndClient" génère le champ Vary. Cela a un impact sur IE dans le fait que IE envoie des requêtes indépendamment. L'utilisation de l'en-tête vary: * peut désactiver la mise en cache de tous les clients ( http://msdn2.microsoft.com/en-us/library/system.web.httpcachepolicy.setomitvarystar.aspx ).

La seule façon de supprimer l'en-tête vary: * et donc de permettre la mise en cache du client était par le biais du code:





outputcache