2

ブラウザによって決してキャッシュされないようにしたい、動的に生成された JavaScript ファイルがあります。私の現在の方法は、各ページ ビューの script タグの URL に (新しい) GUID を追加するだけです。

例えば:

<script type="text/javascript" src="/js/dynamic.js?rand=979F861A-C487-4AA8-8BD6-84E7988BD460"></script>

私の質問は...これが私の目標を達成するための最良の方法ですか?

参考までに、私は ASP.NET MVC 2 を使用しており、コントローラー アクションの結果として JavaScript ファイルが生成されています。

4

6 に答える 6

6

あなたが持っている方法は問題なく機能します。代わりに を使用することもできますDateTime.UtcNow.Ticks。もちろん、キャッシュ制御ヘッダーを使用できますが、絶対に確実にしたい場合は、お持ちの方法が最適です。

ただし、とにかくファイルを動的に生成し、それをページに含める必要がある場合...ページにJavaScriptを貼り付けない理由はありますか? キャッシュしないようにするため、これによりクライアントのラウンドトリップが節約されます。

于 2010-07-17T10:30:27.273 に答える
2

カスタム アクション属性を作成できます。

public class NoCacheAttribute : ActionFilterAttribute
{  
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        var cache = filterContext.HttpContext.Response.Cache;
        cache.SetExpires(DateTime.UtcNow.AddDays(-1));
        cache.SetValidUntilExpires(false);
        cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
        cache.SetCacheability(HttpCacheability.NoCache);
        cache.SetNoStore();
        base.OnResultExecuting(filterContext);
    }
}

次に、JavaScript を生成するコントローラー アクションを次の属性で装飾します。

[NoCache]
public ActionResult MyAction()
{
    ...
}

この場合、追加するランダムな文字列は不要になります。

于 2010-07-17T10:34:20.320 に答える
0

そうね、それがいいね。私は個人的に同じことをしていますが、代わりにタイムスタンプを使用して、常に一意であることを確認しています。

于 2010-07-17T10:31:04.897 に答える
0

HTTP Etags の使用を検討してください。

于 2010-07-17T10:32:01.537 に答える
0

それは人々がそれを行う通常の方法です。完全に確実にするために、各リクエストのファイル名を変更することもできます。

何かのようなもの<script src="{unique string}.js">

于 2010-07-17T10:32:21.117 に答える
0

応答でキャッシュ制御 HTTP ヘッダーを使用します。

Cache-Control: no-cache

(したがって、これは純粋にサーバー設定であり、コーディングは必要ありません。)

または、ASP.NET MVC を使用しているため、ルーティングを使用して URL の最後の要素を無視します。

<script type="text/javascript" src="/js/dynamic.js/979F861A-C487-4AA8-8BD6-84E7988BD460"></script>

MVC ルートを使用してサフィックスを無視します (つまり、提供されるすべての HTML ページに、クエリ パラメータだけでなく、異なるスクリプト URL を持たせる)。

于 2010-07-17T10:47:48.887 に答える