ブラウザにasp.netアプリケーションの最新のjsおよびcssファイルを取得するように強制する


104

一部のブラウザはjsおよびcssファイルをキャッシュし、強制しない限り更新に失敗します。最も簡単な方法は何ですか。

機能しているように見えるこのソリューションを実装しました。

ページでバージョン変数を宣言する

  public string version { get; set; }

web.configキーからバージョン番号を取得する

 version = ConfigurationManager.AppSettings["versionNumber"];

aspxページで、JavaScriptとスタイルシートを次のように呼び出します。

<script src="scripts/myjavascript.js?v=<%=version %>" type="text/javascript"></script>
<link href="styles/mystyle.css?v=<%=version %>" rel="stylesheet" type="text/css" />

したがって、web.configでバージョン= 1.0から1.1に設定した場合、ブラウザーは最新のファイルをダウンロードし、うまくいけばあなたとユーザーの不満を解消できます。

よりよく機能する別の解決策はありますか、またはこれによりWebサイトに予期しない問題が発生しますか?


興味深い質問ですが、最近同じ問題がありましたが、開発テスト中の問題でした。起動後にこれらのファイルを変更するつもりはないので、あまり気にしませんでした。しかし、将来の参考のために解決策を知りたいです!
Brett Allen、

私が見ることができる唯一の問題は、web.configへの変更がバックグラウンドでアプリケーションの再起動を呼び出すことです:msdn.microsoft.com/en-us/library/aa478432.aspx
monty

質問ありがとうございます。これは私が大きな問題を解決するのに役立ちました。
Reddy

回答:


76

最後に変更したタイムスタンプをスクリプトのクエリパラメータとして追加することで、これを解決しました。

私はこれを拡張メソッドで行い、CSHTMLファイルで使用しました。 注:この実装では、タイムスタンプが1分間キャッシュされるため、ディスクをあまりスラッシュしません。

拡張メソッドは次のとおりです。

public static class JavascriptExtension {
    public static MvcHtmlString IncludeVersionedJs(this HtmlHelper helper, string filename) {
        string version = GetVersion(helper, filename);
        return MvcHtmlString.Create("<script type='text/javascript' src='" + filename + version + "'></script>");
    }

    private static string GetVersion(this HtmlHelper helper, string filename)
    {
        var context = helper.ViewContext.RequestContext.HttpContext;

        if (context.Cache[filename] == null)
        {
            var physicalPath = context.Server.MapPath(filename);
            var version = $"?v={new System.IO.FileInfo(physicalPath).LastWriteTime.ToString("MMddHHmmss")}";
            context.Cache.Add(filename, version, null,
              DateTime.Now.AddMinutes(5), TimeSpan.Zero,
              CacheItemPriority.Normal, null);
            return version;
        }
        else
        {
            return context.Cache[filename] as string;
        }
    }
}

そして、CSHTMLページで:

 @Html.IncludeVersionedJs("/MyJavascriptFile.js")

レンダリングされたHTMLでは、これは次のように表示されます。

 <script type='text/javascript' src='/MyJavascriptFile.js?20111129120000'></script>

1
これはmvcに最適です。最新のmvc 5フレームワークでこの問題を処理できるかどうかは疑問です。バンドルが-{version}ワイルドカードで使用するアプローチもこの問題を解決する方法ですが、新しいビルドごとにファイルの名前を変更する必要があります...
kiev

MVCの例の基本をwebforms Webサイトで使用していますが、うまく機能しているので、共有していただきありがとうございます。
ブライアン

リソースファイルの最終変更日時スタンプの表示について心配する理由はありますか?使用されているファイルに数年前の日付/タイムスタンプが付いている場合、企業がユーザーに公開したくない情報である可能性がありますか?
ブライアン

これは標準的な方法であり、主にアプリケーションが従います。ただし、そのタイムスタンプは、アプリケーションをデプロイまたはビルドしたときにのみ変更する必要があります。それ以外の場合は、ユーザーがページを更新したり、アプリケーションの他のページに切り替えたりするたびに。ブラウザはすべてのスタイルシートとJavaScriptを再度ダウンロードしますが、これは適切ではありません
Tarun

2
ページのパフォーマンスにどのような影響がありますか?ページの読み込みにどのくらいの遅延が発生する可能性がありますか?
Durgesh Sonawane 2017年

28

あなたのソリューションは機能します。実は大人気です。

スタックオーバーフローでも同様の方法を使用します。

<link rel="stylesheet" href="http://sstatic.net/so/all.css?v=6184"> 

どこv=6184SVNのリビジョン番号は、おそらくです。


これは、受け入れられた回答で説明されているアプローチよりもはるかに課税アプローチになります。ページが提供されるたびにファイルのSVNバージョンを確認すると、特に時間の経過とともにユーザー数が増加するため、パフォーマンスのオーバーヘッドになります。
Neolisk

4
ビルド中にリビジョン番号を取得し、ファイル(たとえば、部分的な.csファイル)に書き込んで、プロジェクトにそのファイルを含めることができるため、実行時にsvnから読み取る必要はありません。msbuildでこのアプローチを使用して、svnのAssemblyInfo.csファイルにリビジョン番号を入れました。
ラマザンビナルバシ

2
グローバルバージョン/リビジョン番号を使用すると、少なくとも1つの欠点があります。Webサイトの更新を発行すると、変更されたファイルだけでなく、すべての.jsファイルと.cssファイルのブラウザーキャッシュが無効になります。これは、大部分のアプリケーションではおそらく問題ではありませんが、完全を期すために触れておきます。
Adam Tegen 2017

デプロイメントまたはビルド中にassemblyinfo.csファイルのバージョンを自動的に更新した場合、その番号にはマイナーバージョンを使用できます。
kristianp 2018年

28

ASP.NETコア(MVC 6)これは、経由して、箱から出して動作しますasp-append-versionタグのヘルパー:

<script src="scripts/myjavascript.js" asp-append-version="true"></script>
<link href="styles/mystyle.css rel="stylesheet" asp-append-version="true" />

1
知らせてくれてありがとう!知らなかった!
フェデリコナバレテ2017

18

JS / CSSのバンドルを使用する場合、ASP.NET MVCがこれを処理します。GUIDの形式でバージョン番号をバンドルに自動的に追加し、バンドルが更新されたときにのみこのGUIDを更新します(別名、ソースファイルのいずれかに変更があります)。

これは、コンテンツのロード時間を大幅に改善できるため、JS / CSSファイルが大量にある場合にも役立ちます。

こちらをご覧ください


MVCアプリケーションでバンドルを使用する場合、ここに掲載されている回答のメソッドは必要ないということですか?もしそうなら、私が今まで考えてきたように、バンドルは本当にずっと重要です。これらの問題について教えてください。ありがとう。
ジャック

1
はい、正確に。スクリプトがバンドルに含まれている限り、バンドルのソースファイルのいずれかで変更が検出されると、各バンドルのバージョン番号が自動的に生成されます。
jonesy827 2016

また、開発者として頭痛の種であることを忘れないでください。ASP.NETバンドルは、デバッグと開発の際に役立ちます。
it3xl

12

これにはasp.netに組み込みの方法があります:バンドル。ちょうどそれを使用してください。新しいバージョンにはそれぞれ一意のサフィックス「?v = XXXXXXX」が付きます。デバッグモードでは、web.configのmake設定をオンにするためにバンドルがオフになっています。

<system.web>
    <compilation debug="false" />
</system.web>

または、メソッドRegisterBundles(BundleCollection bundles)に追加します。

BundleTable.EnableOptimizations = true;

例えば:

BundleConfig.cs:

bundles.Add(new ScriptBundle("~/Scripts/myjavascript.js")
                .Include("~/Scripts/myjavascript.js"));

bundles.Add(new StyleBundle("~/Content/mystyle.css")
                .Include("~/Content/mystyle.css"));

_Layout.cshtml:

@Scripts.Render("~/Scripts/myjavascript.js")
@Styles.Render("~/Content/mystyle.css")

ただし、これはリリース環境または本番環境でのみ機能します。デバッグモードがオンのときの開発はどうですか?バンドルはまだこの問題を解決しますか?
VAAA 2017

ええ、バンドリンドは開発者の生活を楽にするものではありません。スクリプトを変更するたびにCtrl-F5を押す必要があります。そして、あなたがフレームを持っているなら、それはさらにおかしいでしょう。
it3xl

6

これには、質問のopによって与えられた答えよりも簡単な答えがあります(アプローチは同じです)。

web.configでキーを定義します。

<add key="VersionNumber" value="06032014"/>

aspxページから直接appsettingsを呼び出します。

<link href="styles/navigation.css?v=<%=ConfigurationManager.AppSettings["VersionNumber"]%>" rel="stylesheet" type="text/css" />

私はこれが好きですが、なぜこのソリューションが賛成票がほとんどないのか心配しています...
SimplyInk

@SimplyInkわかりませんが、20の異なる答えがあるので、何か関係があるかもしれません。うまくいき、気に入ったら、遠慮なく賛成投票してください。
JackArbiter

4

Adam Teganの回答に基づいており、Webフォームアプリケーションで使用するために変更されています。

.csクラスコード:

public static class FileUtility
{
    public static string SetJsVersion(HttpContext context, string filename) {
        string version = GetJsFileVersion(context, filename);
        return filename + version;
    }

    private static string GetJsFileVersion(HttpContext context, string filename)
    {
        if (context.Cache[filename] == null)
        {
            string filePhysicalPath = context.Server.MapPath(filename);

            string version = "?v=" + GetFileLastModifiedDateTime(context, filePhysicalPath, "yyyyMMddhhmmss");

            return version;
        }
        else
        {
            return string.Empty;
        }
    }

    public static string GetFileLastModifiedDateTime(HttpContext context, string filePath, string dateFormat)
    {
        return new System.IO.FileInfo(filePath).LastWriteTime.ToString(dateFormat);
    }
}

aspxマークアップ:

<script type="text/javascript" src='<%= FileUtility.SetJsVersion(Context,"/js/exampleJavaScriptFile.js") %>'></script>

レンダリングされたHTMLでは、次のように表示されます

<script type="text/javascript" src='/js/exampleJavaScriptFile.js?v=20150402021544'></script>

2
おい!例は機能していますが、キャッシュの参照を削除するか、キャッシュを使用するようにコードを修正する必要があります。キャッシュを使用する理由がわかりにくいためです。キャッシュを使用するには、context.Cache [filename] == nullの場合にcontext.Cache.Addメソッドを使用して、ファイルのバージョンをキャッシュに追加する必要があります。context.Cache [filename]!= nullの場合、キャッシュされた値(context.Cache [filename])を返す必要があります
Flavia Obreja

1
フラビア、あなたの説明は理にかなっていると思います、そしてそれはよりシンプルで効率的な実装だと思います。役立つコメントとフィードバックを投稿していただきありがとうございます。
ブライアン

4

興味深いことに、このサイトでは、フェイルセーフである必要があるにもかかわらず、プロキシ設定に関連して説明したアプローチに問題があります。

このメタスタックオーバーフローのディスカッションを確認してください。

そのため、GETパラメーターを使用して更新するのではなく、実際のファイル名を使用することは意味があるかもしれません。

href="/css/scriptname/versionNumber.css" 

実際にファイルを作成するか、そのためのURL書き換えを作成する必要があるため、これはより多くの作業です。


4

キャッシュを無効にするためにパスを一意にするシンプルなワンライナーが必要でした。これは私のために働きました:

<script src="scripts/main.js?bust_js_cache=<%=System.IO.File.GetLastWriteTime(Server.MapPath("scripts/main.js")).ToString("HH:mm:ss")%>" type="text/javascript"></script>

ファイルがページに最後にロードされてから変更されている場合、ブラウザは更新されたファイルをプルします。

それlast modified.jsファイルからスタンプを生成し、アクセスするのが容易ではないかもしれないバージョンの代わりにそこにそれをチャックします。

<script src="scripts/main.js?bust_js_cache=10:18:38" type="text/javascript"></script>

別のオプションは、ファイルのチェックサムを取得することです。


1
これを行う最も簡単な方法であり、おそらく最も低いオーバーヘッドです。
トニーヒンクル

1
完璧なソリューション。また、Chrome 70、Firefox 63、IE 11をテストして、キャッシュが実際に機能していることを確認しました。そうです。これは、少なくとも最新バージョンのブラウザーでは、ファイルの新しいバージョンでのキャッシングのみを無効にします。一部のブラウザでは、すべてのファイルにクエリ文字列(?)を再読み込みするという話を耳にしました。おそらくそれが事実だったのかもしれませんし、SafariやOperaの場合もそうです。DK。
Brad Mathews

3

ASP.NET 5 / MVC 6 / vNextで動作するアプローチは次のとおりです。

ステップ1:このスレッドの他の回答と同様に、ファイルの最終書き込み時間を返すクラスを作成します。これにはASP.NET 5(またはその他)の依存関係注入が必要です。

public class FileVersionService
{
    private IHostingEnvironment _hostingEnvironment;
    public FileVersionService(IHostingEnvironment hostingEnvironment)
    {
        _hostingEnvironment = hostingEnvironment;
    }

    public string GetFileVersion(string filename)
    {
       var path = string.Format("{0}{1}", _hostingEnvironment.WebRootPath, filename);
       var fileInfo = new FileInfo(path);
       var version = fileInfo.LastWriteTimeUtc.ToString("yyyyMMddhhmmssfff");
       return version;
     }
}

ステップ2:startup.cs内に注入されるサービスを登録します。

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddScoped<FileVersionService>();
    ...
}

ステップ3:次に、ASP.NET 5では、次のように_Layout.cshtmlなどのレイアウトビューにサービスを直接挿入できます。

@inject Namespace.Here.FileVersionService fileVersionService
<!DOCTYPE html>
<html lang="en" class="@ViewBag.HtmlClass">
<head>
    ...
    <link href="/css/styles.css?v=@fileVersionService.GetFileVersion("\\css\\styles.css")" rel="stylesheet" />
    ...
</head>
<body>
    ...
</body>

物理パスをより適切に組み合わせ、構文をより一貫したスタイルでファイル名を処理するためにできる最後の仕上げがありますが、これは出発点です。ASP.NET 5への移行に役立つことを願っています。


この動作は実際にはそのままでサポートされています。私の回答を
metalheart

3

私のaspnet MVC 4サイトでは少し異なる手法を採用しています。

_ViewStart.cshtml:

@using System.Web.Caching
@using System.Web.Hosting
@{
    Layout = "~/Views/Shared/_Layout.cshtml";
    PageData.Add("scriptFormat", string.Format("<script src=\"{{0}}?_={0}\"></script>", GetDeployTicks()));
}

@functions
{

    private static string GetDeployTicks()
    {
        const string cacheKey = "DeployTicks";
        var returnValue = HttpRuntime.Cache[cacheKey] as string;
        if (null == returnValue)
        {
            var absolute = HostingEnvironment.MapPath("~/Web.config");
            returnValue = File.GetLastWriteTime(absolute).Ticks.ToString();
            HttpRuntime.Cache.Insert(cacheKey, returnValue, new CacheDependency(absolute));
        }
        return returnValue;
    }
}

次に、実際のビューで:

 @Scripts.RenderFormat(PageData["scriptFormat"], "~/Scripts/Search/javascriptFile.min.js")

3

<?php $rand_no = rand(10000000, 99999999)?> <script src="scripts/myjavascript.js?v=<?=$rand_no"></script>

これはすべてのブラウザで機能します。ここでは、PHPを使用してランダムなnoを生成しています。独自のサーバーサイド言語を使用できます。`


いい答えですが、Adamの説明を考慮しないと、ASP MVCは少し問題が発生する可能性があります。MVC5を使用すると、Adamが試してみて、Bundleフォルダーがそれを認識しないためです。
フェデリコナバレテ2017

2

上記の回答から始めて、ヘルパーがCSSファイルでも機能するようにコードを少し修正し、ビルドを行うときだけでなく、ファイルに変更を加えるたびにバージョンを追加しました

public static class HtmlHelperExtensions
{
    public static MvcHtmlString IncludeVersionedJs(this HtmlHelper helper, string filename)
    {
        string version = GetVersion(helper, filename);
        return MvcHtmlString.Create("<script type='text/javascript' src='" + filename + version + "'></script>");
    }

    public static MvcHtmlString IncludeVersionedCss(this HtmlHelper helper, string filename)
    {
        string version = GetVersion(helper, filename);
        return MvcHtmlString.Create("<link href='" + filename + version + "' type ='text/css' rel='stylesheet'/>");
    }

    private static string GetVersion(this HtmlHelper helper, string filename)
    {
        var context = helper.ViewContext.RequestContext.HttpContext;
        var physicalPath = context.Server.MapPath(filename);
        var version = "?v=" +
        new System.IO.FileInfo(physicalPath).LastWriteTime
        .ToString("yyyyMMddHHmmss");
        context.Cache.Add(physicalPath, version, null,
          DateTime.Now.AddMinutes(1), TimeSpan.Zero,
          CacheItemPriority.Normal, null);

        if (context.Cache[filename] == null)
        {
            context.Cache[filename] = version;
            return version;
        }
        else
        {
            if (version != context.Cache[filename].ToString())
            {
                context.Cache[filename] = version;
                return version;
            }
            return context.Cache[filename] as string;
        }
    }
}

1

以下に示すように、ファイルの変更時刻を取得します

private static string GetLastWriteTimeForFile(string pathVal)
    {
        return System.IO.File.GetLastWriteTime(HostingEnvironment.MapPath(pathVal)).ToFileTime().ToString();
    }

これを入力としてクエリ文字列として追加します

public static string AppendDateInFile(string pathVal)
    {
        var patheWithDate = new StringBuilder(pathVal);
        patheWithDate.AppendFormat("{0}x={1}",
                               pathVal.IndexOf('?') >= 0 ? '&' : '?',
                               GetLastWriteTimeForFile(pathVal));
        return patheWithDate.ToString();
    }

マークアップからこれを呼び出します。

MVC拡張ヘルパーアプローチ

拡張メソッドを追加する

namespace TNS.Portal.Helpers
{
    public static class ScriptExtensions
    {
        public static HtmlString QueryStringScript<T>(this HtmlHelper<T> html, string path)
        {
            var file = html.ViewContext.HttpContext.Server.MapPath(path);
            DateTime lastModified = File.GetLastWriteTime(file);
            TagBuilder builder = new TagBuilder("script");
            builder.Attributes["src"] = path + "?modified=" + lastModified.ToString("yyyyMMddhhmmss");
            return new HtmlString(builder.ToString());
        }

       public static HtmlString QueryStringStylesheet<T>(this HtmlHelper<T> html, string path)
       {
        var file = html.ViewContext.HttpContext.Server.MapPath(path);
        DateTime lastModified = File.GetLastWriteTime(file);
        TagBuilder builder = new TagBuilder("link");
        builder.Attributes["href"] = path + "?modified=" + lastModified.ToString("yyyyMMddhhmmss");
        builder.Attributes["rel"] = "stylesheet";
        return new HtmlString(builder.ToString());
      }

    }
}

この名前空間をweb.configに追加します

<system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization"/>
        <add namespace="System.Web.Routing" />
        <add namespace="TNS.Portal" />
        <add namespace="TNS.Portal.Helpers" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

ビューとして使用する

@Html.QueryStringScript("/Scripts/NPIAjaxCalls.js")
@Html.QueryStringStylesheet("/Content/StyledRadio.css")

1

以前の提案を簡素化し、.NET Webフォーム開発者にコードを提供しました。

これは、リソースへのファイルパスで相対( "〜/")と絶対URLの両方を受け入れます。

静的拡張クラスファイルを次のように配置します。

public static string VersionedContent(this HttpContext httpContext, string virtualFilePath)
{
    var physicalFilePath = httpContext.Server.MapPath(virtualFilePath);
    if (httpContext.Cache[physicalFilePath] == null)
    {
        httpContext.Cache[physicalFilePath] = ((Page)httpContext.CurrentHandler).ResolveUrl(virtualFilePath) + (virtualFilePath.Contains("?") ? "&" : "?") + "v=" + File.GetLastWriteTime(physicalFilePath).ToString("yyyyMMddHHmmss");
    }
    return (string)httpContext.Cache[physicalFilePath];
}

マスターページでそれを呼び出す:

<link type="text/css" rel="stylesheet" href="<%= Context.VersionedContent("~/styles/mystyle.css") %>" />
<script type="text/javascript" src="<%= Context.VersionedContent("~/scripts/myjavascript.js") %>"></script>

素敵なアプローチも!
フェデリコナバレテ2017

0

上記の回答に基づいて CSSおよびJSファイルを操作するための小さな拡張クラスを作成しました。

public static class TimestampedContentExtensions
{
    public static string VersionedContent(this UrlHelper helper, string contentPath)
    {
        var context = helper.RequestContext.HttpContext;

        if (context.Cache[contentPath] == null)
        {
            var physicalPath = context.Server.MapPath(contentPath);
            var version = @"v=" + new FileInfo(physicalPath).LastWriteTime.ToString(@"yyyyMMddHHmmss");

            var translatedContentPath = helper.Content(contentPath);

            var versionedContentPath =
                contentPath.Contains(@"?")
                    ? translatedContentPath + @"&" + version
                    : translatedContentPath + @"?" + version;

            context.Cache.Add(physicalPath, version, null, DateTime.Now.AddMinutes(1), TimeSpan.Zero,
                CacheItemPriority.Normal, null);

            context.Cache[contentPath] = versionedContentPath;
            return versionedContentPath;
        }
        else
        {
            return context.Cache[contentPath] as string;
        }
    }
}

次のようなものを書く代わりに:

<link href="@Url.Content(@"~/Content/bootstrap.min.css")" rel="stylesheet" type="text/css" />
<script src="@Url.Content(@"~/Scripts/bootstrap.min.js")"></script>

あなたは今書くことができます:

<link href="@Url.VersionedContent(@"~/Content/bootstrap.min.css")" rel="stylesheet" type="text/css" />
<script src="@Url.VersionedContent(@"~/Scripts/bootstrap.min.js")"></script>

つまり、単純に置き換えるUrl.ContentUrl.VersionedContent

生成されたURLは次のようになります。

<link href="/Content/bootstrap.min.css?v=20151104105858" rel="stylesheet" type="text/css" />
<script src="/Scripts/bootstrap.min.js?v=20151029213517"></script>

拡張クラスを使用する場合は、物理ファイルではないMapPathため、呼び出しが機能しない場合に備えてエラー処理を追加できcontentPathます。


0

私は、各ページを変更せずに、同じような方法で同じことをしています。PreRenderイベントがマスターファイルとして追加されました。私のロジックを1か所に保ち、jsファイルとcssファイルの両方に適用できます。

protected void Page_PreRender(object sender, EventArgs e)
    {
        HtmlLink link = null;
        LiteralControl script = null;


        foreach (Control c in Header.Controls)
        {
            //StyleSheet add version
            if (c is HtmlLink)
            {
                link = c as HtmlLink;


                if (link.Href.EndsWith(".css", StringComparison.InvariantCultureIgnoreCase))
                {
                    link.Href += string.Format("?v={0}", ConfigurationManager.AppSettings["agVersion"]);
                }

            }

            //Js add version
            if (c is LiteralControl)
            {
                script = c as LiteralControl;

                if (script.Text.Contains(".js"))
                {
                    var foundIndexes = new List<int>();


                    for (int i = script.Text.IndexOf(".js\""); i > -1; i = script.Text.IndexOf(".js\"", i + 1))
                    {

                        foundIndexes.Add(i);
                    }

                    for (int i = foundIndexes.Count - 1; i >= 0; i--)
                    {

                        script.Text = script.Text.Insert(foundIndexes[i] + 3, string.Format("?v={0}", ConfigurationManager.AppSettings["agVersion"]));
                    }
                }

            }

        }
    }

0

スクリプトまたはスタイルのDefaultTagFormatプロパティをオーバーライドできます。

Scripts.DefaultTagFormat = @"<script src=""{0}?v=" + ConfigurationManager.AppSettings["pubversion"] + @"""></script>";
Styles.DefaultTagFormat = @"<link href=""{0}?v=" + ConfigurationManager.AppSettings["pubversion"] + @""" rel=""stylesheet""/>";


0

以下のコンセプトで.netアプリケーションにcssバージョン管理を実装する簡単でスマートな方法。バックエンドコードを記述する必要はありません。

<link href="<%="../../App_Themes/Base/css/main.css?v="+ DateTime.Now.ToString("yyyyMMddhhmmss") +""%>" rel="stylesheet" />

これにより、ファイルがまったく変更されていなくても、すべてのページレンダリングで強制的にダウンロードされます。
Thanasis Ioannidis

@ThanasisIoannidisファイルが定期的に変更される場所で使用できます。別のオプションは、web.configにappVersionキーを追加し、ファイル名..で使用することですが、製品のアプリケーションをリリースするときに更新する必要があります。
SantoshK

-1

この方法で行うことの主な問題は、cssファイルまたはjsファイルに変更を加えるたびに、コードのバージョン番号を更新することを覚えておく必要があることです。

これを行うためのおそらくより良い方法は、次のように、cssファイルまたはjsファイルのそれぞれに保証された一意のパラメーターを設定することです。

<script src="scripts/myjavascript.js?_=<%=DateTime.Now.Ticks%>" type="text/javascript"></script>
<link href="styles/mystyle.css?_=<%=DateTime.Now.Ticks%>" rel="stylesheet" type="text/css" />

これにより、ファイルは毎回サーバーから要求されます。つまり、これらのファイルはキャッシュされず、毎回不要な帯域幅を使用するため、ページの読み込み時にサイトのパフォーマンスが低下します。

基本的に、変更が行われるたびにバージョン番号を更新することを忘れないようにできれば、それがどのように行われているかを回避できます。


9
また、大量の帯域幅を使用します。
Darren Kopp、

2
そうです、ページが読み込まれるたびに新しいバージョンのJSが必要ではありません...実際に更新されたバージョンがあるたびに、ブラウザが新しいバージョンを探すようにしたいだけです。
kingdango 2014年

これは、開発中の50KBのCSSファイルの一時ソリューションでは完全に許容されます。+1
コラブス2014年

-2

ASP.NETページの場合、次を使用しています

<script src="/Scripts/pages/common.js" type="text/javascript"></script>

AFTER(強制リロード)

 <script src="/Scripts/pages/common.js?ver<%=DateTime.Now.Ticks.ToString()%>" type="text/javascript"></script>

DateTime.Now.Ticksの追加は非常にうまく機能します。


はい、問題は帯域幅にあります
a /
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.