0

ある生産サイトで問題が発生しました。ページの JavaScript ファイルが更新され、IIS にアップロードされました。を使用してファイルを直接インクルードします

<script src="PATH_TO_SCRIPT" type="text/javascript"></script>

ページが壊れているというクライアントからの苦情を受け始めました。JS ファイルがクライアント マシンにキャッシュされ、サーバーから更新されなかったために発生していました。

今後、javascript ファイル名を変更せずに、この種のシナリオを回避するにはどうすればよいでしょうか?

ASP.Net のバンドルと縮小が役立つ場合があります。しかし、多くのページがあり、サイトはかなりレガシーです。ほとんどすべてのページには、関連付けられた js ファイルにいくつかの重いロジックが記述されています。

サイトは .Net 4.0 および IIS 7 を実行しています

4

2 に答える 2

2

バンドルと縮小は、スクリプトをレンダリングするときに正しいバージョン番号を URL に適切に追加することを処理するため、実際にこれを処理する正しい方法です。

しかし、これがレガシー サイトで、何らかの理由でバンドルを使用できない場合、スクリプト タグを生成し、ファイルのチェックサムを計算し、適切なクエリ文字列パラメーターを追加するサーバー側ヘルパーを作成することが 1 つの可能性です。

public static class ScriptExtensions
{
    public static string Script(this Page page, string relativeUrl)
    {
        var path = page.Server.MapPath(relativeUrl);
        if (File.Exists(path))
        {
            return string.Format(
                "<script type=\"type/javascript\" src=\"{0}?v={1}\"></script>",
                page.ResolveUrl(relativeUrl),
                Hash(path)
            );
        }
        return string.Empty;
    }

    private static string Hash(string file)
    {
        using (var stream = File.OpenRead(file))
        using (var bs = new BufferedStream(stream))
        {
            using (var sha1 = new SHA1Managed())
            {
                byte[] hash = sha1.ComputeHash(bs);
                var result = new StringBuilder(2 * hash.Length);
                foreach (byte b in hash)
                {
                    result.AppendFormat("{0:X2}", b);
                }
                return result.ToString();
            }
        }
    }
}

次に、WebForm 内でヘルパーを使用してスクリプトを含めます。

<%= this.Script("~/scripts/example.js") %>

これにより、次のマークアップが発行されます。

<script type="type/javascript" src="/scripts/example.js?v=3C222D8DFA2A02A02E9A585EA6FE0D95673E8B4A"></script>

スクリプト ファイルの内容を変更すると、その SHA1 チェックサムが異なり、別のバージョンのクエリ文字列パラメーターが生成されて追加され、すべてのクライアント側キャッシュが破棄されます。

于 2013-03-30T11:09:58.193 に答える