2010-07-14 6 views
3

Lors de la création de pages Web, le client/navigateur décide s'il met à jour un fichier comme une image ou .css ou .js ou s'il le prend dans le cache.ASP.NET: Comment appliquer un rechargement d'un fichier Web statique

Dans le cas d'une page .aspx, c'est le serveur qui décide. Bien sûr, au niveau IIS ou en utilisant des techniques HttpModule, je peux changer les en-têtes des requêtes pour dire au client si et combien de temps un fichier doit être mis en cache.

Maintenant, j'ai un site Web où le .aspx va de pair avec un .js correspondant. Donc, j'ai peut-être du code jQuery dans le fichier .js qui accède à un élément dans le fichier .aspx. Si je supprime cet élément du .aspx, j'adapterais aussi le .js. Si l'utilisateur accède à ma page, il obtiendra le nouveau .aspx mais il pourrait tout de même avoir l'ancien .js, entraînant des effets amusants.

Mon site utilise beaucoup de scripts et beaucoup d'images. Pour des raisons de performances, j'ai configuré dans IIS que ces fichiers n'expirent jamais.

Maintenant, de temps en temps un fichier change et je veux m'assurer que les utilisateurs obtiennent les fichiers de mise à jour.

Au début, je me suis aidé en renommant les fichiers. Donc, j'ai eu SkriptV1.js et SkriptV2.js et ainsi de suite. C'est à peu près la pire option puisque l'historique du dépôt est cassé et j'ai besoin d'adapter à la fois les références et le nom du fichier.

Maintenant, je me suis amélioré ici et ne changez que les références en utilisant Skript.js? V = 1 ou Skript.js? V = 2. Cela force le client à actualiser les fichiers. Cela fonctionne bien, mais je dois encore adapter les références.

Maintenant, il y a une amélioration ici comme ceci:

<script type='text/javascript' src='../scripts/<%# GetScriptLastModified("MyScript.js") %>'></script> 

Ainsi, le "GetScriptLastModified" ajoutera le v = paramètre comme ceci:

protected string GetScriptLastModified(string FileName) 
{ 
    string File4Info = System.Threading.Thread.GetDomain().BaseDirectory + @"scripts\" + FileName; 
    System.IO.FileInfo fileInfo = new System.IO.FileInfo(File4Info); 
    return FileName + "?v=" + fileInfo.LastWriteTime.GetHashCode().ToString(); 
} 

Ainsi, dégraissés. js-Link ressemblerait à ceci au client:

<script type='text/javascript' src='/scripts/GamesCharts.js?v=1377815076'></script> 

Le lien changera à chaque fois, quand je uplo ad une nouvelle version et je peux être sûr que l'utilisateur obtienne immédiatement un nouveau script ou une image quand je le change.

Maintenant, deux questions: a) Existe-t-il un moyen plus élégant d'y parvenir? b) Si ce n'est pas le cas: Quelqu'un peut-il deviner quelle serait la surcharge de performance sur le serveur? Il peut y avoir facilement 50 éléments versionnés sur une page, donc pour un .aspx le GetScriptLastModified sera invoqué 50 fois.

Dans l'attente d'une discussion :)

Répondre

0

Il y a quelques réponses différentes à cette question. Tout d'abord, si vous avez des fichiers qui ne changent que de temps en temps, définissez les en-têtes Expires et Cache-Control pour qu'ils expirent dans un an. Seulement si les fichiers vraiment jamais expire si vous dites qu'ils n'expirent jamais. Vous voyez les problèmes de dire "n'expire jamais" en ce moment.En outre, si vous rencontrez des problèmes de performance sur votre site en raison du grand nombre d'images et de JavaScript, la solution généralement acceptée consiste à utiliser un CDN (Content Delivery Network). Il y a beaucoup de fournisseurs différents et je suis sûr que vous pouvez en trouver un qui respecte votre budget. Vous économiserez également de l'argent à long terme puisque le CDN déchargera beaucoup d'E/S et de temps processeur d'IIS. C'est stupéfiant de voir à quel point cela peut faire une différence. Enfin, un moyen de s'assurer que les utilisateurs obtiennent la dernière version de vos fichiers, qui ne changent presque jamais, consiste à implémenter une sorte de schéma de gestion des versions dans les URL de vos actifs afin de faire disparaître le cache. Il y a plusieurs façons de le faire, mais une façon (très naïve) de le faire est d'avoir un numéro de version qui augmente chaque fois que vous déployez sur votre site.

E.g. Toutes les URL de vos actifs ressembleront à /static/123/img/dog_and_pony.jpg

Ensuite, la prochaine fois que vous déploierez sur votre site, vous augmenterez le numéro de version pour qu'il soit "124". Vous auriez besoin d'un moyen de suivre la version, de l'injecter dynamiquement dans les URL des ressources, et de vous assurer que le numéro de version change à chaque fois que vous le déployez. L'idée étant que tout ce qui fait référence à cet actif devrait automatiquement connaître le nouveau numéro de version.

En termes de performances, il est un objectif admirable de ne jamais avoir besoin de l'utilisateur pour actualiser ou avoir à télécharger deux fois la même chose. Mais parfois, c'est beaucoup moins compliqué, et si les utilisateurs ne rafraîchissent que périodiquement, c'est probablement correct pour la plupart des sites Web.

Espérons que cela aide.

Questions connexes