Selon ltra-Fast ASP.NET: Chapter 3 - Caching :
Les fichiers que le navigateur récupère du serveur doivent être stockés dans le cache du navigateur le plus longtemps possible afin de minimiser les allers-retours sur le serveur.
Mais comment IIS sait-il ce qu'est un contenu statique réellement et n'est pas?
Est-ce juste des images, CSS, JS et pas ASPX, ashx ...?
Où puis-je voir dans IIS ce qui est déjà considéré comme statique et ce qui ne l'est pas?
Qu'en est-il du scénario où une page a été déclarée avec <%@ OutputCache
en-tête (sans location
)? Les fichiers source images
, CSS
et JS
à l'intérieur de celui-ci aussi sont-ils mis en cache avec les mêmes propriétés?
En tant que meilleure pratique, je devrais définir une année dans le futur comme délai d'expiration maximum. Je devrais l'utiliser comme valeur par défaut pour tout le contenu statique sur le site
Alors j'ai fait ça:
Mais plus tard, après avoir appuyé sur OK
, je ne trouve aucun menu récapitulatif qui me montre: à qui J'ai déjà mis un en-tête de réponse (dans ce cas: le dossier css
).
actuellement, afin de voir que le dossier css
a été appliqué avec les en-têtes de réponse - je dois aller dans le dossier css
à nouveau -->
En-tête de réponse Http-->
Définir les en-têtes communs -->
et puis je le vois. Il n'est pas écrit dans le web.config.
Mais si je le fais pour un fichier (Login.aspx
par exemple): Je le vois dans web.config:
<configuration>
<location path="Login.aspx">
<system.webServer>
<staticContent>
<clientCache cacheControlMode="UseExpires" cacheControlMaxAge="1.00:00:00" httpExpires="Fri, 15 Feb 2013 00:00:00 GMT" />
</staticContent>
</system.webServer>
</location>
</configuration>
Je comprends ta situation. Parfois, sa confusion comment IIS gère un fichier. C'est également différent pour IIS 6 vs IIS 7 et différent pour Classic App Pools et pools d'applications en mode intégré. Mon expérience concerne principalement les pools d'applications intégrés sur IIS 7.5, c'est donc l'environnement sur lequel je peux commenter le plus précisément possible.
Mais comment IIS sait-il ce qu'est réellement un contenu statique et ce qui ne l'est pas?
Est-ce juste des images, css, js et non ASPX, ashx ...?
Où puis-je voir dans le IIS ce qui est déjà considéré comme statique et ce qui ne l'est pas?
Vous pouvez consulter la liste des gestionnaires de fichiers dans IIS en accédant à votre site Web, puis en cliquant sur "Mappages de gestionnaires". Par défaut, ils sont hérités de la base de données Web.config de base .Net qui se trouve dans un autre emplacement en fonction de la version de votre framework .Net.
Si un fichier demandé n'est pas déjà explicitement mappé à un autre gestionnaire, il tombe dans un gestionnaire catch all (*
) comme dernière option (System.Web.DefaultHttpHandler
) qui détermine s'il s'agit d'un fichier statique ou d'une demande de navigation dans un répertoire. Les fichiers statiques sont donc simplement des fichiers qui ne sont pas déjà liés à un autre gestionnaire. Par exemple, vous verrez que *.aspx
est déjà mappé sur System.Web.UI.PageHandlerFactory
avant ce gestionnaire par défaut. Il va donc être traité par ce gestionnaire et ne pas être considéré comme un fichier statique. Si vous avez supprimé ce mappage, vous pourriez techniquement servir * .aspx en tant que fichier statique si vous le vouliez vraiment (juste pour la preuve de son fonctionnement).
Mais vous pouvez également répertorier explicitement un type de fichier en tant que fichier statique en ajoutant une entrée dans la section httpHandlers de votre web.config mappant les extensions de fichier à System.Web.StaticFileHandler
dans IIS. Par exemple:
<configuration>
<system.webServer>
<handlers>
<add name="StaticHandler" verb="*" path="*.Zip" type="System.Web.StaticFileHandler" preCondition="integratedMode" />
</handlers>
</system.webServer>
</configuration>
Cet exemple utilise le <system.webServer>
section config, donc pour un pool d'applications fonctionnant en mode intégré .
Qu'en est-il du scénario où une page a été déclarée avec un en-tête <% @ OutputCache (sans emplacement). les images, css, fichiers js src à l'intérieur, sont-elles également mises en cache avec les mêmes propriétés?
Non. Étant donné que la page est en cours de serveur en tant que demande distincte (peut-être même par un gestionnaire distinct), elle peut avoir des en-têtes/conseils de cache totalement différents. La page hôte et les ressources qu'elle peut utiliser ne sont pas liées du point de vue de la mise en cache.
En fait, vous voudrez peut-être même avoir une période de cache plus courte pour * .html et une période de cache plus longue pour * .jpg ou * .png? Quelque chose à considérer.
En tant que meilleur prcatice, je devrais définir une année dans le futur comme délai d'expiration maximum, je devrais l'utiliser comme valeur par défaut pour tout le contenu statique sur le site
Hmm ... Je n'irai peut-être pas aussi loin qu'un an. Que diriez-vous d'un mois? Je définirais une politique globale comme celle-ci:
<configuration>
<system.webServer>
<staticContent>
<!-- Set expire headers to 30 days for static content-->
<clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="30.00:00:00" />
</staticContent>
</system.webServer>
</configuration>
C'est le même que l'exemple que vous avez montré ci-dessus, mais n'est pas à l'intérieur d'un <location>
élément, à la place, il est juste dans la racine <configuration>
élément c'est donc la politique par défaut. Encore une fois, cela concerne un pool d'applications fonctionnant en mode intégré . Parfois, vous devez également activer:
<configuration>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<!-- stuff -->
</modules>
</system.webServer>
<system.webServer>
Cela garantit simplement que les fichiers statiques sont traités via le gestionnaire de fichiers statiques gérés qui respecte les éléments de configuration ci-dessus.
La documentation de la boîte de dialogue de configuration que vous avez publiée ci-dessus se trouve ici: Configurer l'en-tête de réponse HTTP Expires (IIS 7)
Apparemment, ces paramètres sont enregistrés dans C:\Windows\System32\inetsrv\config\applicationHost.config
Je n'ai pas IIS7 et je développe personnellement sur IIS 7.5 maintenant. Veuillez donc poster un commentaire si vous pouvez vérifier que cet emplacement est exact!
Cache-Control Header
pour le mettre en cache sur les ordinateurs des navigateurs clients.web.config
comme tu dis. Les commandes que vous ajoutez sur web.config et concernent l'IIS, n'ont pas à voir avec asp.net lui-même, mais avec IIS, et IIS enregistre sa configuration dans un fichier différent, donc lorsque vous modifiez les en-têtes de contrôle du cache directement sur IIS vous ne les voyez pas sur web.config.<%@ OutputCache
sur un contrôle est référé au cache du serveur et non au client, et ce qui est réellement fait est de mettre en cache le rendu du contrôle sur le serveur, donc la prochaine fois que vous lui demanderez de ne pas perdre de temps pour le restituer mais lire à partir du cache - est toujours l'envoyer au navigateur.Et vous pouvez également lire cette réponse pour en savoir plus: Quelle est la différence entre le cache IIS (dynamique et statique), OutPutCache et le cache du navigateur