C'est ma deuxième réponse après avoir fait quelques recherches sur la mise en cache et OutputCache
.
Permettez-moi de répondre à votre deuxième question.
Quels sont les avantages de l'inclusion?
Navigateur met en cache les réponses retournées par le serveur. La mise en cache est contrôlée principalement par trois en-têtes: Cache-Control
, Last-Modified
et Expires
(il y en a d'autres, comme ETag
aussi vient de jouer).
L' Last-Modified
- tête indique au navigateur lorsque la ressource a été modifiée à la dernière. La ressource peut être soit statique fichier ou créés dynamiquement vue. Chaque fois que le navigateur fait la demande pour cette ressource, il vérifie avec le serveur "Hé, j'ai déjà une réponse à cette demande et il est Last-Modified
date est ainsi.. voir l'utilisateur est déjà fatigué... si vous retournez un 304 je suis heureux de pouvoir utiliser la réponse de mon cache reste s'il vous plaît envoyez votre réponse rapide". (Notez que le navigateur transmet l' Last-Modified
de la valeur retournée par le serveur dans un nouvel en-tête appelé If-Modified-Since
)
Idéalement, le serveur doit lire la valeur de l' If-Modified-Since
- tête et a vérifier avec le courant de la date de modification et si elles sont les mêmes, alors il devrait retourner 304 (NON MODIFIÉ) ou alors, il faut retourner la nouvelle copie de la ressource passant à nouveau le courant de la date de modification dans l' Last-Modified
- tête.
L'avantage est mise en cache du navigateur. En tirant parti de la mise en cache du navigateur, le serveur peut éviter de créer un doublon de réponse et il peut aussi renvoyer une nouvelle réponse si la réponse en cache dans le navigateur ressemble à de vieux. Le but ultime est de gagner du temps.
Comment et où puis-je inclure dans MVC?
Dans le cas des ressources statiques (images, fichiers html et d'autres que vous n'avez pas besoin de vous soucier des réglages Comment et Où parce qu' IIS se charge de travail. IIS utilise le fichier de la date de la dernière modification que l' Last-Modified
valeur d'en-tête.
Dans le cas de pages dynamiques comme un contenu html retourné par l'intermédiaire d'un MVC action, comment vous pouvez déterminer le Last-Modified
valeur d'en-tête? La dynamique des pages dynamiques sont pour la plupart fondés sur des données et il est de notre responsabilité de décider si la réponse renvoyée est déjà obsolète ou pas.
Disons que vous avez un blog et vous avez une page si vous affichez les détails d'un article (et pas tous les autres détails), puis la page de la version est décidé par la date de dernière modification ou de la date de création (si l'article n'est pas modifié encore) de l'article. De sorte que vous avez à faire le même travail répondu par @jgauffin dans l'action correspondante qui offre la vue.
Vous avez demandé dans les commentaires Devrais-je inclure par action dans le contrôleur?
Si vous pouviez en mesure de faire abstraction de la logique de la lecture de la dernière date de modification de la base de données des actions alors que vous pourriez accomplir le travail par le biais d'un filtre d'actions d'éviter la duplication du code à travers des actions. La question est de savoir comment vous allez faire abstraction des détails loin d'actions? Comme passer de la table/les noms de colonnes à l'attribut? Vous devez le comprendre!
Comme un exemple..
[LastModifiedCacheFilter(Table = "tblArticles", Column = "last_modified")]
public ViewResult Post(int postId)
{
var post = ... get the post from database using the postId
return View(post);
}
Le pseudo-code (ce qui signifie que je n'ai pas testé :) de l' LastModifiedCacheFilterAttribute
mise en œuvre montré ci-dessous utilise la Table/Colonne de lire la date de dernière modification, mais ça peut être quelques autres façons. L'idée est dans l' OnActionExecuting
méthode que nous faisons de la vérification et le retour d'un 304 (si le cache est encore frais) et dans l' OnResultExecuted
méthode que nous lecture/réglage de la dernière date de modification.
public class LastModifiedCacheFilterAttribute : ActionFilterAttribute
{
// Could be some other things instead of Table/Column
public string Table { get; set; }
public string Column { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// var lastModified = read the value from the passed Column/Table and set it here
var ifModifiedSinceHeader = filterContext.RequestContext.HttpContext.Request.Headers["If-Modified-Since"];
if (!String.IsNullOrEmpty(ifModifiedSinceHeader))
{
var modifiedSince = DateTime.Parse(ifModifiedSinceHeader).ToLocalTime();
if (modifiedSince >= lastModified)
{
filterContext.Result = new EmptyResult();
filterContext.RequestContext.HttpContext.Response.Cache.SetLastModified(lastModified.ToUniversalTime());
filterContext.RequestContext.HttpContext.Response.StatusCode = 304;
}
}
base.OnActionExecuting(filterContext);
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
// var lastModified = read the value from the passed Column/Table and set it herefilterContext.RequestContext.HttpContext.Response.Cache.SetLastModified(lastModified.ToUniversalTime());
base.OnResultExecuted(filterContext);
}
}
Pourquoi ne peut-OutputCache attribut?
Selon mon analyse, OutputCache
attribut n'utilise pas les Last-Modified
mécanisme de mise en cache. L'autre chose, c'est qu'il utilise l'ancienne page mécanisme de mise en cache ce qui rend difficile pour personnaliser/prolonger.
Avez-vous vraiment besoin de mettre en œuvre la dernière modification du mécanisme dans toutes vos actions?
Vraiment pas nécessaire. Vous pourriez mettre en œuvre la dernière modification du mécanisme pour les actions qui prend plus de temps pour créer une telle réponse, et il faut plus de temps pour voyager la réponse en bas de la fil et de la portée du navigateur. Dans d'autres cas, je me sens juste un rétroprojecteur tout au long de la mise en œuvre de toutes les actions et aussi que vous avez à mesurer les avantages avant de le faire. L'autre point principal est, dans de nombreux cas la version de la page est pas décidé par une seule colonne de la table , il pourrait être beaucoup d'autres choses et dans ce cas, il peut être plus compliqué à mettre en œuvre cette!
Un point sur l' ETag
Bien que la question est à propos de Last-Modified
- tête que je devrais dire quelque chose à propos de ETag
avant de cliquer sur le Post de Votre Réponse bouton. Comparé à d' Last-Modified
(qui s'appuie sur datetime) en-tête ETag
- tête (s'appuie sur une valeur de hachage) est plus précise de déterminer si la réponse en cache dans le navigateur est frais ou pas, mais il pourrait être un peu compliqué à mettre en œuvre. IIS comprend également ETag
- tête avec l' Last-Modified
- tête pour les ressources statiques. Avant de mettre en œuvre toute de ce mécanisme de google et de voir s'il existe une bibliothèque qui vous permet de sortir!