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!
Je viens d'avoir exactement le même problème. J'ai un dossier avec 2 fichiers CSS:
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.
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:
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.
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.
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.
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.
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>
Il suffit de mettre à jour votre System.Web.Optimization par NuGet
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.
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.
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.
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é.
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.