ASP.NET-bundeling – Bundel wordt niet bijgewerkt nadat het opgenomen bestand is gewijzigd (retourneert 304 niet gewijzigd)

Ik probeer ASP.NET-bundeling met ASP.NET MVC 4-toepassing. De situatie is dat ik een CDN-achtige service wil maken, die JS- en CSS-bestanden heeft waarnaar je kunt adresseren vanaf andere sites met dit type adres: http://www.mycdn.com/scripts/plugin/js, dat alle meegeleverde .js-bestanden bundelt en verkleint.

Mijn bundelconfiguratie voor één bestand ziet er als volgt uit:

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

Als ik dit echter doe, worden de bundels niet bijgewerkt, zelfs niet nadat ik de originele js-bestanden heb gewijzigd. Ik krijg steeds 304 Not Modified als ik mijn browser vernieuw en de inhoud van het verkleinde bestand wordt niet bijgewerkt. Hoe kan ik bundels updaten, omdat het nutteloos is om bundels met oude inhoud te hebben? Ik heb alle mogelijke manieren geprobeerd, maar kon geen oplossing vinden.

Bij voorbaat dank!


Antwoord 1, autoriteit 100%

Ik had net hetzelfde probleem. Ik heb een map met 2 CSS-bestanden:

  • ~/Content/main.css
  • ~/Content/main.min.css (bestaande uit mijn vorige handmatige minificatieproces)

Mijn bundelcode is dit:

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

Hoeveel ik mijn main.cssook heb gewijzigd, de uitvoer was dezelfde url met dezelfde inhoud:

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

De enige manier om de bundel bij te werken was om mijn oplossing opnieuw te bouwen – uiteraard niet de beste aanpak.

Echter zodra ik main.min.cssverwijderde, begon alles prima te werken.Door wat meer te spelen, ontdekte ik dat als er beide main.cssen main.min.css, dan zal het updaten van main.min.cssde bundel daadwerkelijk updaten… Vreemd, maar op zijn minst voorspelbaar.


Antwoord 2, autoriteit 40%

Na gevochten te hebben om erachter te komen waardoor de bundelcache wordt vernieuwd, kwam ik tot een paar conclusies die hopelijk anderen zullen helpen:

Als .min-bestanden ZIJN inbegrepen als onderdeel van de bundel:

  • release-modus + min js-code wijzigen = cache vernieuwen
  • release-modus + niet-min js-code wijzigen = geen cacheverversing
  • foutopsporingsmodus + wijzig min js-code = geen cacheverversing
  • foutopsporingsmodus + niet-min js-code wijzigen = geen cacheverversing

Als .min-bestanden NIET zijn opgenomen als onderdeel van de bundel:

  • foutopsporingsmodus + js-code wijzigen = geen cacheverversing
  • release-modus + js-code wijzigen = cache vernieuwen

Opmerkingen

  • Met debug-modus bedoel ik web.config compilatie debug = true (en
    BundleTable.EnableOptimizations = false of is weggelaten)
  • Met release-modus bedoel ik web.config compilatie debug = false (en
    BundleTable.EnableOptimizations = waar of is weggelaten
  • Zorg ervoor dat u daadwerkelijk wijzigingen in de code aanbrengt. Wijzigingen zoals spaties
    en opmerkingen hebben geen invloed op de resulterende verkleinde js, dus de server is
    correct omdat er geen wijzigingen zijn (dus de bundelcache niet)
    vernieuwd).

Antwoord 3, autoriteit 12%

Houd er rekening mee dat als u Google Chrome gebruikt, de caching behoorlijk agressief is. Om er zeker van te zijn dat niets in de cache wordt opgeslagen, kun je Ctrl-Shift-Idoen om het ontwikkelaarsvenster te openen. Ga naar Networken klik op Disable Cache. Zorg ervoor dat u deze open houdt. Ververs nu de pagina. Je cache zou moeten worden gewist en de bestandswijzigingen zouden nu moeten worden weergegeven.


Antwoord 4, autoriteit 10%

Ok, hier is mijn verhaal. Ik heb het genereren van min-bestanden uitgeschakeld voor minder bestanden in Web Essentials. Oude min-bestanden werden niet verwijderd en bundeldingen zagen die in plaats van bijgewerkte CSS. Veel succes!

BEWERKEN

Enige tijd later besteedde ik nog een goede 2 uur aan hetzelfde probleem. Deze keer was het mijn fout, denk ik – ik vergat de leidende tilde, d.w.z. ik schreef

Scripts.Render("/js/script")

in plaats van

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

Om wat voor reden dan ook werkte het soms, en soms niet.


Antwoord 5, autoriteit 3%

Ik heb eigenlijk besloten om System.Web.Optimization niet te gebruiken voor deze taak, maar ik vond Microsoft Ajax Minifier, dat ook is opgenomen in WebGrease.dll, dat wordt geleverd met de MVC4 System.Web.Optimization-bibliotheek. Ik heb de volgende functie geschreven, die ik vervolgens in Application_Start heb aangeroepen voor elk verkleind bestand:

   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);
    }

Mijn applicatie verkleint nu alle bestanden op Application_Start.


Antwoord 6, autoriteit 3%

De bundelbewerking is hoofdlettergevoelig. Zorg ervoor dat de bestandsnaam de juiste hoofdletters heeft.

Ik moest een regel wijzigen in mijn BundleConfig.cs:

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

Antwoord 7

Ik weet niet zeker of de functie zoals die er nu uitziet het zijn van een CDN echt zal ondersteunen, omdat het impliciet afhankelijk is van de url om een ​​hashcode te bevatten om browsercaching te voorkomen.

Maar ik kan proberen je te helpen om daar te komen, en misschien is het vandaag mogelijk… Een probleem dat mogelijk een wegversperring kan zijn, is dat de BundleHandler 304 retourneert op alle bundelverzoeken die de IfLastModified-header bevatten, aangezien de veronderstelling is dat de browsercache altijd geldig is vanwege de vingerafdruk in de url.

Kun je wat details toevoegen over hoe je verwijzingen naar de bundels weergeeft? Gebruik je zoiets als Scripts.Render(“~/Scripts/plugin/pluginjs”)?

Uw bundelscripttag zou er ongeveer zo uit moeten zien:

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

Als je scripttags verwijzen naar de onbewerkte bundel zonder versietekenreeks, zou dat waarschijnlijk de cachingproblemen verklaren die je ziet:

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

Antwoord 8

Ik weet dat het een tijdje geleden is dat dit is bijgewerkt, maar ik heb ontdekt dat ik slechts een paar seconden moet wachten om de bundel mijn CSS-wijzigingen te laten inhalen. Ik heb de bootstrap-minder bestanden die worden gecompileerd in een css en min.css en het is zeker niet meteen om mijn wijzigingen te zien. Bij mij was het ongeveer 10 seconden op een snelle pc met een ssd. Uw mijlen kunnen variëren op basis van uw systeemspecificaties.


Antwoord 9

Ik zag dit antwoord, maar geen van deze was voor mij het geval.
Er waren bepaalde CSS-regels die de Styles Bundler faalden en ik kreeg dezelfde hash, zelfs als ik wijzigingen in het CSS-bestand heb gemaakt. Het werkte allemaal correct voor mij.

In mijn geval was de overtredende CSS-selector regel –

#globalSearch.searching { ... }

Als ik dit slechts

heb gemaakt

.searching { ... }

Het begint allemaal weer te werken en eventuele wijzigingen die ik aanbreng in mijn CSS-bestand de Bundler Hash verandert correct.
Gewoon dit antwoord toevoegen omdat het iemand kan helpen.


Antwoord 10

Update gewoon uw systeem.web.optimisatie door Nuget


Antwoord 11

Voor wat het waard is, had ik hetzelfde probleem zojuist met één JS-bestand dat onverklaarbaar weigert om bij te werken, ongeacht wat (herbouwen, geforceerd cache clear, enz.). Na een tijdje schakelde ik het opdrachtgever-instrumenten in IE aan op (F12) om te gaan kijken naar het netwerkverkeer, en deze act heeft alleen het JS-bestand gedwongen om te vernieuwen. Ga figuur, maar het werkte.


Antwoord 12

Het probleem voor mij was dat ik Fiddler liep. Nadat ik DIT heb gesloten en mijn oplossing herbouwde, laadde het de wijzigingen in het JS-bestand voor mij.


Antwoord 13

Ik had een soortgelijk probleem. In mijn situatie had ik een CSS-bestand waarnaar wordt verwezen in een stijlbundel en had die bundel waarnaar wordt verwezen in mijn MVC-weergave. Ik had ook de vlag “EnableOptimizations” ingesteld op False in de bundelcode.

Ondanks dit alles weigerde het beeld bij te werken om het nieuwe CSS-bestand op te nemen.

Mijn oplossing was om een ​​gedureerde versie van het CSS-bestand te maken en deze in het project op te nemen en het begon te werken. Ik heb geen idee waarom dit het geval zou zijn, aangezien dit gedichte bestand niet overal wordt verwezen (zelfs na de weergave bijgewerkt) en niet eens moet worden overwogen omdat de code niet is geoptimaliseerd. Dit is hoogstwaarschijnlijk een bug (of een functie) van de bundelende functionaliteit. Ik hoop dat dit iemand anders helpt bij dit probleem.


Antwoord 14

Zorg ervoor dat uw app echt wordt ingezet in de Release-modus en dat uw host dubbel is met de instellingen. Ik had dit probleem, maar na het onderzoeken besefte ik dat mijn bestanden niet daadwerkelijk werden gebundeld. Ik heb in de Release-modus geïmplementeerd, maar om een ​​of andere reden (ik vermoed gastheer), denk ik dat mijn app echt in debug werd ingezet.

Ik moest het volgende instellen aan het einde van het BundleConfig.cs-bestand om bundeling te forceren, wat op zijn beurt het bijgewerkte bestand dwong om eindelijk in de browser te tonen.

BundleTable.EnableOptimizations = true;

Antwoord 15

Ik had dit probleem vandaag en ik ging door alle antwoorden, maar mijn probleem is hier niet opgelost door een van de oplossingen. Later ontdekte ik dat dit gebeurde omdat er een foutmelding was in mijn CSS. Een van de URL’s was niet gesloten (het laatste single-citaat ontbrak).

Hierdoor heeft het CSS-bestand een syntaxisfout hebben en het compileer niet voor de BundleConfig. Ik veronderstel dat er een bericht zou zijn geweest in het uitvoerlogboek, maar ik had niet gecontroleerd.

Als dit in 2020 met u gebeurt, probeert u ervoor te zorgen dat uw CSS geen syntaxisfout heeft.

Other episodes