ウェブページを作成するとき、クライアント/ブラウザは、画像、.css、.jsなどのファイルを更新するか、それともキャッシュから取得するかを決定します。
.aspxページの場合、決定するのはサーバーです。
もちろん、IISレベルで、またはいくつかのHttpModule手法を使用して、要求のヘッダーを変更して、ファイルをキャッシュするかどうか、およびキャッシュする期間をクライアントに通知できます。
今、私は.aspxが対応する.jsと連携するWebサイトを持っています。したがって、おそらく私は.aspxの要素にアクセスする.jsにいくつかのjQueryコードを持っています。その要素を.aspxから削除すると、.jsも適応します。ユーザーが私のページにアクセスすると、新しい.aspxを取得しますが、古い.jsを取得する可能性があり、面白い効果が得られます。
私のサイトはたくさんのスクリプトとたくさんの画像を使っています。パフォーマンス上の理由から、IISで、これらのファイルが「期限切れにならない」ように構成しました。
さて、ファイルは時々変更されます。ユーザーが更新ファイルを確実に入手できるようにしたいと思います。
最初は、ファイルの名前を変更することで自分自身を助けました。だから、私はSkriptV1.jsとSkriptV2.jsなどを持っていました。リポジトリの履歴が壊れており、参照とファイル名の両方を調整する必要があるため、これは最悪のオプションです。
ここで改善し、Skript.js?v = 1またはSkript.js?v=2を使用して参照のみを変更しました。これにより、クライアントはファイルを更新する必要があります。それはうまく機能しますが、それでも私は参照を適応させる必要があります。
さて、ここには次のようなさらなる改善があります:
<script type='text/javascript' src='../scripts/<%# GetScriptLastModified("MyScript.js") %>'></script>
したがって、「GetScriptLastModified」は次のように?v=パラメータを追加します。
protected string GetScriptLastModified(string FileName)
{
string File4Info = System.Threading.Thread.GetDomain().BaseDirectory + @"scripts\" + FileName;
System.IO.FileInfo fileInfo = new System.IO.FileInfo(File4Info);
return FileName + "?v=" + fileInfo.LastWriteTime.GetHashCode().ToString();
}
したがって、レンダリングされた.js-Linkは、クライアントには次のようになります。
<script type='text/javascript' src='/scripts/GamesCharts.js?v=1377815076'></script>
新しいバージョンをアップロードすると、リンクは毎回変更されます。変更すると、ユーザーはすぐに新しいスクリプトまたは画像を取得できます。
さて、2つの質問:a)これを達成するためのよりエレガントな方法はありますか?b)そうでない場合:サーバーのパフォーマンスオーバーヘッドがどれほど大きくなるかを誰かが推測していますか?1ページに50のバージョン管理された要素が簡単に存在する可能性があるため、1つの.aspxに対してGetScriptLastModifiedが50回呼び出されます。
議論を楽しみにしています:)