web-dev-qa-db-fra.com

Regroupement ASP.NET - Regroupement non mis à jour après la modification du fichier inclus (retourne 304 non modifié)

J'essaie de combiner ASP.NET avec l'application ASP.NET MVC 4. La situation est que je souhaite créer un service de style CDN contenant des fichiers JS et CSS auxquels vous pouvez vous adresser à partir d'autres sites ayant cette adresse de type: http://www.mycdn.com/scripts/plugin/js , qui regroupe et réduit tous les fichiers .js inclus.

Ma configuration de paquet pour un fichier ressemble à ceci:

bundles.Add(new ScriptBundle("~/Scripts/plugin/pluginjs").Include("~/Scripts/plugin/jquery.plugin.js"));

Cependant, lorsque je le fais, les ensembles ne sont pas mis à jour même après avoir modifié les fichiers js d'origine. Je continue d’obtenir 304 non modifié, lors de l’actualisation de mon navigateur, et le contenu du fichier modifié n’est pas mis à jour. Comment puis-je mettre à jour des ensembles, car il est inutile d'avoir des ensembles contenant de l'ancien contenu? J'ai essayé tous les moyens, mais je ne pouvais pas trouver de solution.

Merci d'avance!

64
Tommi Gustafsson

Je viens d'avoir exactement le même problème. J'ai un dossier avec 2 fichiers CSS:

  • ~/Content/main.css
  • ~/Content/main.min.css (pré-existant de mon précédent processus de minification manuelle)

Mon code de groupement est le suivant:

bundles.Add(new StyleBundle("~/css/main").Include("~/content/main.css"));

Peu importe combien j'ai changé mon main.css la sortie était la même URL avec le même contenu:

<link href="/css/main?v=6Xf_QaUMSlzHbXralZP7Msq1EiLTd7g1vId6Vcy8NJM1" rel="stylesheet"/>

La seule façon de mettre à jour le bundle était de reconstruire ma solution - ce n'est évidemment pas la meilleure approche.

Cependant dès que j'ai supprimé main.min.css, tout a commencé à fonctionner correctement. Jouer un peu plus, j'ai découvert que s'il y avait à la fois main.css et main.min.css, la mise à jour de main.min.css mettrait à jour le paquet ... Bizarre, mais au moins prévisible.

76
niaher

Après avoir lutté pour comprendre ce qui rend la mise à jour de la mémoire cache du paquetage, je suis arrivé à quelques conclusions qui, espérons-le, aideront les autres:

Si les fichiers .min sont inclus dans le kit:

  • mode de libération + changement min js code = actualisation de la mémoire cache
  • mode de libération + changement non min js code = pas de rafraîchissement du cache
  • mode débogage + changement min code js = pas d'actualisation du cache
  • mode débogage + changement non min js code = pas de rafraîchissement du cache

Si les fichiers .min ne sont PAS inclus dans le kit:

  • mode débogage + changement de code js = pas d'actualisation du cache
  • mode de libération + changement de code js = actualisation du cache

Remarques

  • En mode débogage, je veux dire compilation web.config debug = true (et BundleTable.EnableOptimizations = false ou est omis)
  • Par mode de publication je veux dire compilation web.config debug = false (et BundleTable.EnableOptimizations = true ou est omis
  • Assurez-vous de réellement modifier le code. Les modifications telles que les espaces .__ et les commentaires n'affectent pas le fichier js résultant. Le serveur est donc Correct, car il n'y a aucune modification (le cache d'ensembles n'est donc pas Actualisé).
31
Bolo

Ok, voici mon histoire. J'ai désactivé la génération de fichiers min pour moins de fichiers dans Web Essentials. Les anciens fichiers min n’étaient pas supprimés et le paquetage les voyait à la place du CSS mis à jour. Bonne chance!

MODIFIER 

Quelque temps plus tard, j'ai passé encore deux bonnes heures sur le même problème. Cette fois-ci, c’est de ma faute, je suppose - j’ai oublié le tilde principal, c’est-à-dire j’ai écrit

Scripts.Render("/js/script")

au lieu de 

Scripts.Render("~/js/script")

Pour une raison quelconque, cela a parfois fonctionné, et parfois cela n'a pas été le cas.

9
Gleno

L'opération de groupement est sensible à la casse. Assurez-vous que le nom du fichier a la casse appropriée.

Je devais changer une ligne dans mon BundleConfig.cs:

bundles.Add(new StyleBundle("~/Content/css").Include(
    "~/Content/bootstrap.css",
    "~/Content/Site.css"));  <-- Uppercased.
3
Doug Mair

Veuillez noter que si vous utilisez Google Chrome, la mise en cache est assez agressive. Pour vous assurer que rien n'est mis en cache, vous pouvez utiliser Ctrl-Shift-I pour afficher le volet développeur. Allez à Network et cliquez sur Disable Cache. Assurez-vous de garder cela ouvert. Maintenant, actualisez la page. Votre cache doit être effacé et les modifications du fichier doivent être reflétées maintenant.

 Disable cache in Google Chrome

3
coolboyjules

J'ai en fait décidé de ne pas utiliser System.Web.Optimization pour cette tâche, mais j'ai trouvé Microsoft Ajax Minifier, également inclus dans WebGrease.dll, fourni avec la bibliothèque MVC4 System.Web.Optimization. J'ai écrit la fonction suivante, que j'ai ensuite appelée dans Application_Start pour chaque fichier minifié:

    public static void MinifyFile(string virtualPath)
    {
        string fullPath = HttpContext.Current.Server.MapPath(virtualPath);
        string extension = Path.GetExtension(fullPath).ToLower();
        string targetPath = fullPath.Substring(0, fullPath.Length - extension.Length) + ".min" + extension;
        if(File.Exists(fullPath) == false) 
        {
            throw new FileNotFoundException("File not found: " + fullPath);
        }
        string input = File.ReadAllText(fullPath);
        string output;
        if (extension == ".js")
        {
            Microsoft.Ajax.Utilities.Minifier jsmin = new Microsoft.Ajax.Utilities.Minifier();
            output = jsmin.MinifyJavaScript(input);
        }
        else if (extension == ".css")
        {
            Microsoft.Ajax.Utilities.Minifier jsmin = new Microsoft.Ajax.Utilities.Minifier();
            output = jsmin.MinifyStyleSheet(input);                
        }
        else
        {
            throw new NotSupportedException(extension + " is not supported for minification.");
        }
        File.WriteAllText(targetPath, output);
    }

Maintenant, mon application réduit au minimum tous les fichiers sur Application_Start.

3
Tommi Gustafsson

Je ne suis pas sûr que la fonctionnalité actuelle prenne réellement en charge le fait d'être un CDN, car elle s'appuie implicitement sur l'URL pour contenir un hashcode afin d'empêcher la mise en cache du navigateur. 

Mais je peux essayer de vous aider à y parvenir, et peut-être que c'est possible aujourd'hui ... Un problème qui pourrait potentiellement être un obstacle est que BundleHandler renverra 304 sur toutes les demandes d'offre contenant l'en-tête IfLastModified le cache du navigateur est toujours valide en raison de l’empreinte digitale dans l’URL.

Pouvez-vous ajouter des détails sur la manière dont vous rendez les références aux ensembles? Utilisez-vous quelque chose comme Scripts.Render ("~/Scripts/plugin/pluginjs")?

Votre balise de script bundle devrait ressembler à ceci:

Good: <script src="/fbt/bundles/js?v=wvLq7H7qEZB2giyIRn7aEZAxhHOb2RfTYYh2HMd9EqM1"></script>

Si vos balises de script font référence à l'ensemble brut sans chaîne de version, cela expliquerait probablement les problèmes de mise en cache que vous rencontrez:

Not good: <script src="/fbt/bundles/js></script>
1
Hao Kung

Il suffit de mettre à jour votre System.Web.Optimization par NuGet enter image description here

enter image description here

0
Emanuel Lima

J'avais un problème similaire. Dans ma situation, j'avais un fichier CSS référencé dans un ensemble de styles et ce dernier dans ma vue MVC. L'indicateur "EnableOptimizations" était également défini sur false dans le code de l'ensemble.

Malgré tout, la vue a refusé de se mettre à jour pour inclure le nouveau fichier CSS.

Ma solution consistait à créer une version simplifiée du fichier CSS et à l'inclure dans le projet, qui a commencé à fonctionner. Je n'ai aucune idée de la raison pour laquelle ce serait le cas puisque ce fichier simplifié n'est référencé nulle part (même après la mise à jour de la vue) et ne devrait même pas être pris en compte car le code est configuré pour ne pas être optimisé. Il s’agit très probablement d’un bogue (ou d’une fonctionnalité) de la fonctionnalité de groupement. J'espère que cela aide quelqu'un d'autre à rencontrer ce problème.

0
mfranchi

J'ai vu cette réponse, mais rien de tout cela n'était le cas pour moi… .. Il y avait certaines règles CSS qui faisaient échouer le bundler de styles et j'avais le même hash, même si j'avais modifié le fichier CSS. Tout fonctionnait correctement avant pour moi.

Dans mon cas, la règle de sélection css violante était - 

#globalSearch.searching { ... }

Si je faisais ça juste 

.searching { ... }

Tout recommence à fonctionner et toutes les modifications que je fais dans mon fichier CSS le hachage du bundler change correctement ... Tout en ajoutant cette réponse car cela pourrait aider quelqu'un.

0
MoXplod

Le problème pour moi était que Fiddler courait. Après avoir fermé et reconstruit ma solution, il chargeait les modifications dans le fichier js pour moi.

0
TruthOf42

Pour ce que ça vaut, j'ai le même problème tout à l'heure avec un fichier js refusant inexplicablement de mettre à jour quoi qu'il arrive (reconstruction, effacement forcé du cache, etc.). Après un certain temps, j'ai activé les outils de débogage client dans IE (F12) pour commencer à surveiller le trafic réseau, et cette action seule a obligé le fichier JS à se régénérer. Allez comprendre, mais cela a fonctionné.

0
Sentinel

Je sais que cela fait longtemps que cette mise à jour a été mise à jour, mais j’ai constaté que j’avais juste besoin d’attendre quelques secondes pour que le paquet puisse suivre l’évolution de mes modifications CSS. J'ai le bootstrap moins de fichiers en cours de compilation en css et min.css et ce n'est certainement pas instantané de voir mes modifications. Pour moi, c’était environ 10 secondes sur un PC rapide avec un SSD. Vos miles peuvent varier en fonction des spécifications de votre système.

0
LasstLos