IIS et contenu statique?

selon Ultra-Fast ASP.NET: Chapitre 3 - Caching :

les fichiers que le navigateur extrait du serveur doivent être stockés dans le cache du navigateur aussi longtemps que possible pour aider à réduire le serveur d'aller-retours.

  • mais comment L'IIS sait-il ce qu'est un contenu statique ?

    est-il seulement les images, CSS, JS et non pas ASPX, ashx...?

    puis-je voir dans IIS ce qui est déjà considéré comme statique et ce qui n'est pas ?

  • Qu'en est-il du scénario où une page a été déclarée avec un en-tête <%@ OutputCache (sans location )? Sont les fichiers source images , CSS et JS à l'intérieur du it aussi étant sortie mise en cache avec les mêmes propriétés?

  • en tant que meilleure pratique, je devrais fixer un an dans le futur comme la durée maximale d'expiration. Je devrais utiliser cela comme la valeur par défaut pour tout le contenu statique sur le site

alors j'ai fait ceci :

Set Common HTTP Response Headers

mais plus tard, après pressurage OK , I ne trouve pas de menu 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 des en - têtes de réponse- je dois aller au css dossier encore --> en-tête de réponse Http --> ensemble des en-têtes communs --> et 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>
42
demandé sur Sam 2013-01-08 13:37:02

2 réponses

je comprends votre situation. Parfois, la façon dont IIS gère un fichier est déroutante. Il est également différent pour IIS 6 vs IIS 7 et différent pour les Pools D'applications classiques et les pools d'applications en mode intégré. Mon expérience est principalement avec des piscines App intégrées sur IIS 7.5, donc c'est l'environnement que je peux commenter le plus précisément.

Première Question

mais comment IIS sait-il ce qui est réellement un contenu statique et ce qui est pas?

Est-il seulement les images , css , js et non ASPX , ashx...?

Où puis-je voir dans L'IIS ce qui est déjà considéré comme statique et qu'est-ce pas ?

vous pouvez consulter la liste des gestionnaires de fichiers dans IIS en naviguant sur votre site Web, puis en cliquant sur "handler Mappings". Par défaut, ils sont hérités du web de base .Net.config qui se trouve dans un emplacement différent selon votre version .net framework.

  • C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\web.config
  • C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\web.config

si un fichier demandé n'est pas déjà explicitement mappé sur un autre gestionnaire, il tombe sur un gestionnaire de captures ( * ) comme dernière option ( System.Web.DefaultHttpHandler ) qui détermine s'il s'agit d'un fichier statique ou d'une requête de navigation dans un répertoire. Donc les fichiers statiques sont tout simplement des fichiers non lié à un autre gestionnaire déjà. Par exemple, vous verrez que *.aspx est déjà mappé à 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 supprimez ce mapping, vous pouvez techniquement servir *.aspx comme un fichier statique si vous avez vraiment voulu (juste pour la preuve de comment il fonctionne).

mais vous pouvez aussi explicitement lister un type de fichier en tant que Fichier statique en ajoutant une entrée dans votre web.config section httpHandlers mappant les extensions de fichier en 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 la section de configuration <system.webServer> , donc pour un Pool D'applications tournant en mode intégré .

Deuxième Question

Qu'en est-il du scénario où une page a été déclarée avec <%@ En-tête OutputCache (sans emplacement) . le images,css,js src fichier à l'intérieur de celui-ci , sont également en sortie mise en cache avec le même propriétés?

Pas de. Parce que la page est server comme une requête séparée (peut-être même par un gestionnaire séparé), elle peut avoir des en-têtes/indices de cache totalement différents. La page d'accueil et les ressources qu'elle peut utiliser ne sont pas liées du point de vue de la mise en cache.

en fait, vous pouvez même vouloir 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.

Troisième Question

comme une meilleure pratique, je devrais mettre un an dans le futur comme le durée d'expiration maximale.Je devrais utiliser comme valeur par défaut pour tous les le contenu statique sur le site

Hmm... Je ne pourrais pas aller jusqu'à un an. Comment environ un mois? Je voudrais établir une politique globale comme ceci:

<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>

identique à l'échantillon vous avez montré ci-dessus, mais n'est pas dans un élément <location> , à la place il est juste dans l'élément root <configuration> donc c'est la politique par défaut. Encore une fois, c'est pour un Pool D'applications tournant en mode intégré . Parfois, il faut aussi allumer:

<configuration>
    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true">
            <!-- stuff -->
        </modules>
    </system.webServer>
<system.webServer>

cela permet juste de s'assurer que les fichiers statiques sont traités par le gestionnaire de fichiers statiques géré qui respecte les éléments de configuration ci-dessus.

modifier L'adresse Commentaires

la documentation pour la boîte de dialogue de configuration que vous avez affichée ci-dessus est située 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 développer personnellement sur IIS 7.5. Donc, s'il vous plaît poster un commentaire si vous pouvez vérifier cet endroit est exact!

66
répondu BenSwayne 2017-05-23 10:31:16
  1. le contenu statique est celui qui est lu et envoyé au navigateur sans aucun traitement. Là, vous pouvez configurer IIS pour inclure certains Cache-Control Header pour le mettre en cache sur les ordinateurs de navigateur des clients.
  2. vous pouvez faire cet éther par la configuration directe IIS, éther par les commandes sur web.config comme vous dites. Les commandes que vous ajoutez sur le web.config et le souci de l'IIS, n'ont rien à voir avec asp.net il l'auto, mais l'IIS, IIS et sauve sa configuration sur un autre ainsi, lorsque vous changez les en-têtes de contrôle de cache directement sur IIS, vous ne les voyez pas sur le web.config.
  3. maintenant pour le contenu statique comme les images, CSS, JavaScript, et d'autres fichiers similaires ils disent que vous pouvez suivre la Politique "jamais expirer" en ajoutant 10 ans expirent.
  4. Le problème ici est que si vous ne pouvez pas modifier le contenu du fichier statique, si par exemple vous cache un fichier javascript à 10 ans, et vous faire un petit changez sur elle, puis vous avez besoin d'éther pour changer le nom du fichier, d'éther pour ajouter un paramètre à la fin de celui-ci.
  5. maintenant le <%@ OutputCache sur un contrôle est référé au cache du serveur et non au client, et ce qui est en fait faire est de mettre en cache le rendu du contrôle sur le serveur de sorte que la prochaine fois que vous lui demandez de ne pas perdre le temps de le rendre à nouveau, mais de le lire à partir de cache - est toujours l'envoyer au navigateur.

Et vous pouvez aussi lire cette réponse pour un peu plus: Quelle est la différence entre cache IIS (dynamique et statique), OutPutCache et cache navigateur

4
répondu Aristos 2017-05-23 11:55:03