web-dev-qa-db-ja.com

ASP.NETバンドル-含まれているファイルが変更された後、バンドルが更新されない(304が変更されずに返される)

ASP.NET MVC 4アプリケーションでASP.NETバンドリングを試しています。状況は、このタイプのアドレスを持つ他のサイトからアドレス指定できるJSファイルとCSSファイルを含むCDNスタイルのサービスを作成することです。 http://www.mycdn.com/scripts/plugin/ js 、含まれるすべての.jsファイルをバンドルおよび縮小します。

1つのファイルのバンドル構成は次のようになります。

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

ただし、これを行うと、元のjsファイルを変更した後でもバンドルが更新されません。ブラウザを更新すると、304 Not Modifiedが表示され続け、縮小されたファイルのコンテンツは更新されません。古いコンテンツを含むバンドルを使用するのは役に立たないため、バンドルを更新するにはどうすればよいですか?私はあらゆる方法を試しましたが、解決策を見つけることができませんでした。

前もって感謝します!

68

まったく同じ問題がありました。 2つのCSSファイルがあるフォルダーがあります。

  • 〜/ Content/main.css
  • 〜/ Content/main.min.css(以前の手動の縮小プロセスから既存のもの)

私のバンドルコードはこれです:

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

main.cssをどれだけ変更しても、出力は同じコンテンツの同じURLでした:

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

バンドルを更新する唯一の方法は、ソリューションを再構築することでした。明らかに最善の方法ではありません。

しかしmain.min.cssを削除するとすぐにすべてが正常に動作し始めました。もう少し再生すると、main.cssmain.min.cssの両方がある場合、 main.min.cssを更新すると、実際にバンドルが更新されます...奇妙ですが、少なくとも予測可能です。

78
niaher

バンドルキャッシュの更新の原因を突き止めるために戦った後、私は他の人を助けることを願ういくつかの結論に達しました。

.minファイルがバンドルの一部として含まれている場合:

  • リリースモード+最小jsコードの変更=キャッシュの更新
  • リリースモード+非最小jsコードの変更=キャッシュの更新なし
  • デバッグモード+最小jsコードの変更=キャッシュリフレッシュなし
  • デバッグモード+非最小jsコードの変更=キャッシュリフレッシュなし

.minファイルがバンドルの一部として含まれていない場合:

  • デバッグモード+ jsコードの変更=キャッシュの更新なし
  • リリースモード+ jsコードの変更=キャッシュの更新

ノート

  • デバッグモードでは、web.configのコンパイルデバッグ= true(およびBundleTable.EnableOptimizations = falseまたは省略)を意味します
  • リリースモードでは、web.configのコンパイルデバッグ= false(およびBundleTable.EnableOptimizations = trueまたは省略されます)を意味します
  • 実際にコードを変更していることを確認してください。スペースやコメントなどの変更は、結果の縮小されたjsに影響しないため、サーバーは変更がないという点で正しいです(したがって、バンドルキャッシュは更新されません)。
33
Bolo

さて、これが私の話です。 Web Essentialsでより少ないファイルの最小ファイルの生成を無効にしました。古い最小ファイルは削除されず、バンドルされたものは更新されたCSSの代わりにそれらを見ました。幸運を!

[〜#〜] edit [〜#〜]

しばらくして、同じ問題にさらに2時間費やしました。今回は私のせいだったと思う-主要なチルダを忘れた、つまり

Scripts.Render("/js/script")

代わりに

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

なんらかの理由で、時には機能し、時にはそのようなことをしませんでした。

9
Gleno

Google Chromeを使用している場合、キャッシュは非常に積極的です。キャッシュされないようにするには、_Ctrl-Shift-I_を実行して開発者ペインを表示できます。Networkをクリックし、_Disable Cache_をクリックします。これを開いたままにして、ページを更新します。キャッシュがクリアされ、ファイルの変更が反映されます。

Disable cache in Google Chrome

5
coolboyjules

バンドリング操作では、大文字と小文字が区別されます。ファイル名の大文字と小文字が適切であることを確認してください。

BundleConfig.csの行を変更する必要がありました。

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

実際、このタスクにSystem.Web.Optimizationを使用しないことにしましたが、MVC4 System.Web.Optimizationライブラリに付属しているWebGrease.dllにも含まれているMicrosoft Ajax Minifierを見つけました。次の関数を作成し、縮小したファイルごとにApplication_Startで呼び出しました。

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

現在、私のアプリケーションはApplication_Start上のすべてのファイルを縮小しています。

3

現在の機能がCDNであることを実際にサポートするかどうかはわかりません。ブラウザーのキャッシュを防ぐためにハッシュコードを含むことを暗黙的にURLに依存しているためです。

しかし、私はあなたがそこに到達しようとするのを手伝うことができます、そしておそらく今日可能です...潜在的な障害の可能性がある1つの問題は、IfLastModifiedヘッダーを含むバンドル要求でBundleHandlerが304を返すことですURLのフィンガープリントのため、ブラウザーのキャッシュは常に有効です。

バンドルへの参照をレンダリングする方法に関する詳細を追加できますか? Scripts.Render( "〜/ Scripts/plugin/pluginjs")のようなものを使用していますか?

バンドルスクリプトタグは次のようになります。

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

スクリプトタグがバージョン文字列なしで生のバンドルを参照している場合、表示されるキャッシュの問題を説明する可能性があります。

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

NuGetでSystem.Web.Optimizationを更新するだけです enter image description here

enter image description here

0
Emanuel Lima

同様の問題がありました。私の状況では、スタイルバンドルで参照されているCSSファイルがあり、MVCビューでそのバンドルが参照されていました。また、バンドルコードで「EnableOptimizations」フラグをfalseに設定しました。

これらすべてにもかかわらず、ビューは新しいCSSファイルを含めるための更新を拒否しました。

私の解決策は、CSSファイルの縮小バージョンを作成し、プロジェクトに含めることで、機能し始めました。縮小されたファイルはどこでも参照されないため(ビューが更新された後でも)、コードが最適化されないように設定されているため、考慮されるべきではないので、なぜこれが当てはまるのか分かりません。これはおそらく、バンドル機能のバグ(または機能)です。これが他の誰かがこの問題に遭遇するのを助けることを願っています。

0
mfranchi

私はこの答えを見ましたが、これらのどれも私には当てはまりませんでした。 CSSファイルに変更を加えた場合でも、スタイルバンドラーを失敗させていた特定のCSSルールがあり、同じハッシュを取得していました。以前はすべて正常に機能していました。

私の場合、違反しているcssセレクタールールは-

#globalSearch.searching { ... }

これを作ったら

.searching { ... }

すべてが再び動作を開始し、cssファイルに加えた変更によりバンドラーハッシュが正しく変更されます。誰かを助けるかもしれないので、この答えを追加するだけです。

0
MoXplod

私にとっての問題は、Fiddlerを実行していたことです。 DITを閉じてソリューションを再構築した後、jsファイルの変更が読み込まれました。

0
TruthOf42

それが価値があることについては、私はちょうど1つのjsファイルが何であれ更新することを不可解に拒否するという同じ問題を抱えていました(再構築、強制キャッシュクリアなど)。しばらくして、クライアントデバッグツールをIE on(F12)で切り替えてネットワークトラフィックの監視を開始し、この行為だけでJSファイルが更新されました。

0
Sentinel

これが更新されてからしばらく経っていますが、バンドルがcssの変更に追いつくまで数秒待つ必要があることがわかりました。 bootstrap以下のファイルがcssとmin.cssにコンパイルされており、私の変更を確認するのは間違いなくすぐではありません。マイルはシステムの仕様によって異なる場合があります。

0
LasstLos