Comment «invalider» des parties du cache de sortie ASP.NET MVC?

Existe-t-il un moyen d’invalider par programmation des parties du cache de sortie ASP.NET MVC? Ce que je voudrais pouvoir faire, c’est qu’un utilisateur qui publie des données modifiant ce qui serait renvoyé par une action mise en cache puisse invalider ces données mises en cache.

Est-ce seulement possible?

Une façon consiste à utiliser la méthode:

HttpResponse.RemoveOutputCacheItem("/Home/About"); 

Une autre façon est décrite ici: http://aspalliance.com/668

Je pense que vous pourriez implémenter la deuxième méthode en utilisant un atsortingbut de niveau de méthode pour chaque action que vous voulez et ajoutez simplement la chaîne représentant la clé. C’est si j’ai compris votre question.

Edit: Yes asp.net mvc OutputCache est juste un wrapper.

Si vous utilisez varyByParam="none" vous invalidez simplement "/Statistics" – si / sont des valeurs de chaîne de requête. Cela invalidera toutes les versions de la page.

J’ai fait un test rapide et si vous ajoutez varyByParam="id1" et créez ensuite plusieurs versions de la page – si vous dites invalider invalider "/Statistics/id1" cela invalidera seulement cette version. Mais vous devriez faire d’autres tests.

J’ai fait des tests sur la mise en cache. C’est ce que j’ai trouvé:

Vous devez effacer le cache pour chaque route qui mène à votre action. Si vous avez 3 itinéraires menant à la même action dans votre contrôleur, vous disposerez d’un cache pour chaque route.

Disons que j’ai cette route config:

 routes.MapRoute( name: "config1", url: "c/{id}", defaults: new { controller = "myController", action = "myAction", id = UrlParameter.Optional } ); routes.MapRoute( name: "Defaultuser", url: "u/{user}/{controller}/{action}/{id}", defaults: new { controller = "Accueil", action = "Index", user = 0, id = UrlParameter.Optional } ); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Accueil", action = "Index", id = UrlParameter.Optional } ); 

Ensuite, ces 3 routes mènent à myAction dans myController avec le myParam :

  1. http://example.com/c/myParam
  2. http://example.com/myController/myAction/myParam
  3. http://example.com/u/0/myController/myAction/myParam

Si mon action est comme suit

 public class SiteController : ControllerCommon { [OutputCache(Duration = 86400, VaryByParam = "id")] public ActionResult Cabinet(ssortingng id) { return View(); } } 

Je vais avoir un cache pour chaque route (dans ce cas 3). Par conséquent, je devrai invalider chaque itinéraire.

Comme ça

 private void InvalidateCache(ssortingng id) { var urlToRemove = Url.Action("myAction", "myController", new { id}); //this will always clear the cache as the route config will create the path Response.RemoveOutputCacheItem(urlToRemove); Response.RemoveOutputCacheItem(ssortingng.Format("/myController/myAction/{0}", id)); Response.RemoveOutputCacheItem(ssortingng.Format("/u/0/myController/myAction/{0}", id)); }