2011-12-09 9 views
3

静的コンテンツがクライアントにキャッシュされている(静的にはjs、css、jpeg、gifなどを意味します)問題があります。 (クライアントによっては、私の開発マシンをほとんど意味する)。バージョン情報で静的コンテンツを含める方法

その結果、ページにスクリプトエラーが表示されるか、正しく表示されません。私はRailsの開発者ではありませんが、それについてのいくつかの本を時間通りに読んでいます。私はよく覚えて一つのことは、それが

<script src="~/Scripts/Invoice.js?201112091712" type="text/javascript"></script> 

になり、あなたがその内容を変更した場合、ファイルは新しいバージョン番号を生成し、それは違うを生成して、それは、インクルードされたファイルの最後にいくつかの魔法のバージョン番号を付加していることです結果として、クライアントは新しいコンテンツであると判断し、キャッシュをチェックせずにロードします。

asp.net-mvc 3 & IIS 7はこれをサポートしていますか、またはこの動作を模倣するツールを知っていますか?私はこのようなものでしたHazım

答えて

6

、あなたがそれらを好きなら、私のヘルパーを使用して自由に感じる:

public static class VersionedContentExtensions 
{ 
    public static MvcHtmlString VersionedScript(this HtmlHelper html, string file) 
    { 
     return VersionedContent(html, "<script src=\"{0}\" type=\"text/javascript\"></script>", file);      
    } 

    public static MvcHtmlString VersionedStyle(this HtmlHelper html, string file) 
    { 
     return VersionedContent(html, "<link href=\"{0}\" rel=\"stylesheet\" type=\"text/css\">", file); 
    } 

    private static MvcHtmlString VersionedContent(this HtmlHelper html, string template, string file) 
    { 
     string hash = HttpContext.Current.Application["VersionedContentHash_" + file] as string; 
     if (hash == null) 
     { 
      string filename = HttpContext.Current.Server.MapPath(file); 
      hash = GetMD5HashFromFile(filename); 
      HttpContext.Current.Application["VersionedContentHash_" + file] = hash; 
     } 

     return MvcHtmlString.Create(string.Format(template, file + "?v=" + hash)); 
    } 

    private static string GetMD5HashFromFile(string fileName) 
    { 
     FileStream file = new FileStream(fileName, FileMode.Open); 
     MD5 md5 = new MD5CryptoServiceProvider(); 
     byte[] retVal = md5.ComputeHash(file); 
     file.Close(); 

     StringBuilder sb = new StringBuilder(); 
     for (int i = 0; i < retVal.Length; i++) 
     { 
      sb.Append(retVal[i].ToString("x2")); 
     } 
     return sb.ToString(); 
    } 
} 

は、このようにそれらを使用します。

@Html.VersionedScript("/Scripts/sccat.core.js") 
1

おかげで、:GenerateScriptUrl方法で

<script src="<%= GenerateScriptUrl("~/Scripts/Invoide.js") %>"></script> 

を、私は、ファイルの内容を記述し、バージョン番号とURLを取得後、MD5値を計算します。 urlはキャッシュされるので、2回計算されます。また、キャッシュをクリアするハンドラ(ユーザに公開されていない)を作成します。したがって、ファイルの内容が変更されたときにプロセスを再起動する必要はありません。

最後に変更されたものを含むバージョン番号を取得することもできます。ファイルの変更をFileSystemWatcherなどで監視することもできます。

希望すると助かります。私はこの私のプロジェクトの一つで、すでに行っている

+0

だから、(ハンドラのように)jsファイルを処理するために何かする必要がありますか、それともIISが処理しますか? – hazimdikenli

+0

申し訳ありませんが、私は「Invoice.js?20111209」のようなファイルを提供することでIISが正常であることを確認しました。 – hazimdikenli

0

が追加され、これを試してみてください次に、ファイル更新時刻

public static class UrlHelperExtentention 
{ 
    public static string VersionedContent(this UrlHelper urlHelper, 
               string contentPath) 
    { 
     string versionedContent= urlHelper.Content(contentPath); 

     string modified= File.GetLastWriteTime(
           HostingEnvironment.MapPath(contentPath)) 
           .ToString("yyyyMMddhhmm"); 
     if (result.Contains('?')) 
      versionedContent += "&" + modified; 
     else 
      versionedContent += "?" + modified; 

     return versionedContent; 
    } 
} 

<script src="@Url.VersionedContent("~/js/Home.js")" type="text/javascript"/> 
関連する問題