2009-02-16 8 views
7

Je souhaite pouvoir définir une durée d'expiration longue pour certains éléments qu'un utilisateur télécharge via la requête GET. Je veux dire 'c'est bon pour 10 minutes' (c'est-à-dire que je veux définir un en-tête Expires pendant +10 minutes). Les demandes sont des fragments de HTML qui sont affichés dans la page via AJAX et ils sont bons pour la session de l'utilisateur. Je ne veux pas retourner au serveur et obtenir un 304 s'il en a besoin - Je veux que le cache du navigateur me donne instantanément le même élément.Comment utiliser au mieux l'en-tête Expires dans ASP.NET MVC?

J'ai trouvé un article qui date de presque un an sur MVC Action filter caching and compression. Cela crée un ActionFilter personnalisé pour modifier l'en-tête expires. J'utilise déjà le filtre de compression qui fonctionne très bien pour certains css personnalisés que je génère (taux de compression de 94%!).

J'ai deux principales préoccupations:

1) Dois-je vraiment utiliser cette méthode. Je suis bien avec si je le fais, mais il n'y a vraiment aucune fonctionnalité dans MVC ou la fonctionnalité OutputCache pour le faire pour moi? Dans ASP.NET 'traditionnel', j'ai toujours réglé l'en-tête Expires manuellement, mais nous ne pouvons plus le faire - du moins pas dans le contrôleur.

2) Si j'utilise cette méthode de filtrage - va-t-elle interférer avec la politique OutputCache - que je veux pouvoir contrôler dans web.config. Je pense que les deux sont mutuellement exclusifs et vous ne voudriez pas les deux - mais je ne suis pas complètement sûr.

Répondre

3
  1. Non, vous ne ont d'utiliser cette méthode. Cependant, je pense que c'est probablement la meilleure méthode à choisir, car cela rend le contrôleur plus testable et moins sensible au web. L'alternative serait de définir l'en-tête manuellement dans le contrôleur, comme ceci:

    Response.AddHeader ("Expires", "Jeu, 01 Dec 1994 16:00:00 GMT");

  2. Eh bien, l'attribut OutputCache contrôle quand l'action s'exécute du tout, et quand elle retourne du HTML mis en cache à la place. Expires indique au navigateur quand récupérer le code HTML. Donc je ne les appellerais pas mutuellement exclusifs, mais ils sont certainement les deux faces d'une même pièce, et vous avez raison de penser que vous n'avez pas besoin des deux. Je suggère de passer en revue the HTTP spec pour décider ce qui est le plus approprié pour votre application.

+0

@craig merci pour vos commentaires. Je suppose qu'une règle de base concernant # 2 est que si la vue générée est très simple (c'est-à-dire pas d'accès à la base de données) alors expire peut être tout ce qui est nécessaire. Si dix appels de méthode Web sont requis, vous devez utiliser OutputCache. parfois vous voulez des têtes ET des queues à droite :-) –

+3

Considérez: Si 10 personnes (sur différents ordinateurs) demandent votre page 10 fois chacune, Expire par lui-même signifie que votre action s'exécute 10 fois et le serveur gère 10 demandes. La mise en cache seule signifie que votre action s'exécute une fois et que le serveur gère 100 requêtes. Expire et met en cache ensemble signifie que votre action s'exécute une fois et que le serveur gère 10 demandes. –

2

Response.Expires Cette propriété indique le nombre de minutes avant un cache de page dans le navigateur arrive à expiration à savoir. Si l'utilisateur revient à la même page avant le nombre de minutes spécifié, la version mise en cache de la page est affichée.

Response.ExpiresAbsolute En utilisant cette propriété, nous pouvons régler la date et/ou heure à laquelle la page en cache dans le navigateur arrive à expiration.

http://forums.asp.net/t/1532229.aspx

0

Il semble que vous avez juste besoin de faire varier par l'utilisateur:

http://aspadvice.com/blogs/ssmith/archive/2007/10/29/VaryByCustom-Caching-By-User.aspx

[OutputCache(Duration="10", VaryByCustom="username")] 

Global.asax:

public override string GetVaryByCustomString(HttpContext context, string key) 
{ 
    switch(key) 
    { 
     case "username": 
      return context.User.Identity.Name; 

     // Other VaryByCustom strategy implementations can go here. 
    } 

    return string.Empty; 
} 
Questions connexes