2009-12-15 9 views
1

Je souhaite donner mes futurs fichiers CSS et javascript aux en-têtes futurs et ajouter un jeton aux URL qui leur sont renvoyées. De cette façon, les navigateurs n'ont pas besoin de re-télécharger CSS et javascript, sauf si j'ai publié une nouvelle version du site.Passage de l'horodatage de construction au code

http://example.com/css/styles.css?build=23424

Comment puis-je passer un numéro de version ou l'horodatage à mon code-behind il peut ajouter l'horodatage?

Il est évident que C# n'a pas de macros, ce que j'utiliserais en C/C++.

Je me rends compte que cela va forcer les navigateurs à télécharger des ressources chaque fois que je fais une nouvelle construction - que la construction implique ou non la modification des ressources. Cependant, je voudrais mettre en place un système simple avant d'implémenter quelque chose de plus avancé comme regarder les temps de modification de fichiers individuels.

Répondre

2

Voici un peu de code que j'utilise pour extraire l'ID de construction de l'assemblage actuel au démarrage de l'application. Il lit le numéro de version de l'assembly, un descripteur de version (dev/qa/blank) de la configuration web, puis construit une chaîne de numéro de version à insérer dans l'application. Ce code va dans Global.asax.cs. Vous pouvez ensuite vous y référer dans votre balisage depuis l'instance de l'application.

var webAssembly = Assembly.GetAssembly(typeof(...known class...)); 
var designator = WebConfigurationManager.AppSettings["VersionDesignator"]; 
string version = webAssembly.GetName().Version + designator; 
this.Application.Add("Version", version); 

Voici un exemple de la façon dont vous pouvez l'utiliser dans un contexte MVC (désolé, je n'ai pas des exemples WebForms).

<link type="text/css" rel="stylesheet" 
     href="/Content/styles/screen.css?build=<%= this.Application["Version"] %>" /> 
2

Idée intéressante.

est ici une façon de le faire:

  1. Allez dans votre classe AssemblyInfo.cs dans le dossier Propriétés dans votre projet.
  2. Modifiez la version de votre assembly pour inclure le caractère générique star: [assembly: AssemblyVersion ("1.0. *")].
  3. Dans votre code, vous pouvez récupérer la version de version actuelle comme ceci:

_

var buildNumber = Assembly.GetExecutingAssembly().GetName().Version.Build; 

_

C'est, vous avez terminé. Si vous modifiez AssemblyVersion à 1.0. *, Visual Studio/MSBuild incrémentera automatiquement le numéro de build pour chaque build. Ensuite, vous pouvez accéder à ce numéro de build lors de l'exécution en utilisant l'extrait de code ci-dessus. Facile comme le fromage.

+0

Mais il n'y a aucune raison de le faire de cette façon. Ce n'est pas comme si le numéro de build incrémenté automatiquement était différent d'un nombre défini pour cette instance. Serait plus facile de laisser le build nuber tel quel et utiliser simplement votre propriété buildNumber pour l'utiliser est nécessaire. –

+0

Un nombre défini dur doit être incrémenté manuellement. –

0

Les navigateurs et les serveurs savent gérer la mise en cache via HTTP. Donc, je me méprends, qu'est-ce que vous essayez d'accomplir en fournissant ce genre de mise en cache. Un navigateur ne téléchargera pas à nouveau votre CSS et Javascript s'il l'a vu récemment. Et il sera re-télécharger si vous faites une poussée de votre nouvelle construction sur le serveur. Voir les en-têtes de cache comme Cache-control et Expires etc. Voici un tutoriel http://www.mnot.net/cache_docs/

Questions connexes