チュートリアル: ASP.NET 内のアプリケーション データのキャッシュ
キャッシュを使用するとメモリにデータを格納しておくことができるのですぐにアクセスできます。 アプリケーションはキャッシュにアクセスするので、データにアクセスするたびに元のソースからデータを取得する必要がありません。 これによりデータに対するクエリを繰り返す必要がなくなり、パフォーマンスとスケーラビリティが向上します。 さらにキャッシュを使用するとデータ ソースが一時的に使用できない場合もデータが使用可能になります。
.NET Framework には ASP.NET アプリケーションでキャッシュ機能を使用できるクラスが用意されています。 これらのクラスは、System.Runtime.Caching 名前空間で定義されます。
注意
System.Runtime.Caching 名前空間は .NET Framework 4 で新たに追加されました。この名前空間を使用すると、すべての .NET Framework アプリケーションでキャッシュを使用できます。
このチュートリアルでは、.NET Framework で使用可能なキャッシュ機能を ASP.NET アプリケーションの一部として使用する方法について説明します。 チュートリアルではテキスト ファイルの内容をキャッシュします。
このチュートリアルでは、以下のタスクを行います。
ASP.NET Web サイトを作成します。
.NET Framework 4 に参照を追加します。
ファイルの内容をキャッシュするキャッシュ エントリを追加します。
キャッシュ エントリの削除ポリシーを指定します。
キャッシュ ファイルのパスを監視し、監視対象の項目への変更をキャッシュに通知します。
必須コンポーネント
このチュートリアルを完了するための要件は次のとおりです。
Microsoft Visual Studio 2010
少量のテキストを含むテキスト ファイル。 このテキスト ファイルの内容を Web ページに表示します。
ASP.NET Web サイトの作成
まず ASP.NET Web サイトを作成します。
注意
このチュートリアルでは、Web サイト プロジェクトを使用します。代わりに、Web アプリケーション プロジェクトを使用することもできます。これらの Web プロジェクトの種類の違いについては、「Web アプリケーション プロジェクトと Web サイト プロジェクト」を参照してください。
ASP.NET Web サイトを作成するには
Visual Studio 2010 を起動します。
[ファイル] メニューの [新しい Web サイト] をクリックします。 (このオプションが表示されない場合は、[新規作成] をクリックし、[Web サイト] をクリックします)。
[新しい Web サイト] ダイアログ ボックスが表示されます。
[インストールされたテンプレート] の [Visual Basic] または [C#] をクリックし、[ASP.NET Web サイト] をクリックします。
[Web の場所] ボックスで、[ファイル システム] をクリックし、Web サイトのページを格納するフォルダーの名前を入力します。 たとえば、フォルダー名として「C:\Websites\AppCaching」と入力し、[OK] をクリックします。
Visual Studio によって、レイアウト (マスター ページ、Default.aspx および About.aspx コンテンツ ページ、カスケード スタイル シート)、Ajax (クライアント スクリプト ファイル)、および認証 (ASP.NET メンバーシップ) のためのビルド済みの機能を含む Web プロジェクトが作成されます。 新しいページが作成されると、既定で Visual Web Developer のソース ビューにそのページが表示され、そこでそのページの HTML 要素を確認できます。
次の手順では、使用するテキスト ファイルを現在の Web サイト プロジェクトに追加します。
テキスト ファイルをプロジェクトに追加するには
ソリューション エクスプローラーでプロジェクトの名前を右クリックし、[既存項目の追加] をクリックします。
[既存項目の追加] ダイアログ ボックスで、このチュートリアルで使用するテキスト ファイルを選択し、[追加] をクリックします。
キャッシュ アセンブリへの参照の追加
ASP.NET アプリケーションで System.Runtime.Caching 名前空間を使用するには、名前空間に参照を追加する必要があります。
Web サイトに参照を追加するには
ソリューション エクスプローラーで Web サイトの名前を右クリックし、[参照の追加] をクリックします。
[.NET] タブの System.Runtime.Caching を選択し、[OK] をクリックします。
ASP.NET ページへのコントロールの追加
次にボタンと Label コントロールをページに追加します。 ボタンの Click イベントのイベント ハンドラーを作成します。 後でコードを追加し、ボタンをクリックしたときにキャッシュされたテキストが Label コントロールに表示されるようにします。
ページにコントロールを追加するには
Default.aspx ページを開くか、そのページに切り替えます。
ツールボックスの [標準] タブから Button コントロールを Default.aspx ページにドラッグします。
プロパティ ウィンドウで、Button コントロールの Text プロパティを「Get From Cache」に設定します。 既定の ID プロパティを受け入れます。
ツールボックスの [標準] タブから、Label コントロールをページにドラッグします。 既定の ID プロパティを受け入れます。
キャッシュの作成とエントリのキャッシュ
次に、次のタスクを行うコードを追加します。
キャッシュ クラスのインスタンスを作成します。つまりキャッシュ オブジェクトのインスタンスを生成します。
キャッシュが HostFileChangeMonitor オブジェクトを使用してテキスト ファイルの変更を監視するよう指定します。
テキスト ファイルを読み取り、その内容をキャッシュ エントリとしてキャッシュします。
キャッシュしたテキスト ファイルの内容を表示します。
キャッシュ オブジェクトを作成するには
ボタンをダブルクリックして、Default.aspx.cs または Default.aspx.vb ファイルにイベント ハンドラーを作成します。
ファイルの上部 (クラス宣言の前) に次の Imports (Visual Basic) または using (C#) ステートメントを追加します。
[Visual Basic]
Imports System.Runtime.Caching Imports System.IO
[C#]
using System.Runtime.Caching; using System.IO;
キャッシュのインスタンスを生成するためにイベント ハンドラーに次のコードを追加します。
[Visual Basic]
Dim cache As ObjectCache = MemoryCache.Default
[C#]
ObjectCache cache = MemoryCache.Default;
ObjectCache は、メモリ内キャッシュ オブジェクトを実装するメソッドを提供する基本クラスです。
注意
ASP.NET 4 では、キャッシュは ObjectCache クラスを使用して実装されます。
filecontents という名前のキャッシュ エントリの内容を読み取るために次のコードを追加します。
[Visual Basic]
Dim fileContents As String = TryCast(cache("filecontents"), String)
[C#]
string fileContents = cache["filecontents"] as string;
filecontents という名前のキャッシュ エントリがあるかどうかを確認するために次のコードを追加します。
[Visual Basic]
If fileContents Is Nothing Then End If
[C#]
if (fileContents == null) { }
指定したキャッシュ エントリがない場合は、テキスト ファイルを読み取り、これをキャッシュ エントリとしてキャッシュに追加する必要があります。
キャッシュの有効期限が 10 秒後に切れるように指定する新しい CacheItemPolicy オブジェクトを作成するために、if/then ブロックに次のコードを追加します。
[Visual Basic]
Dim policy As New CacheItemPolicy() policy.AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10.0)
[C#]
CacheItemPolicy policy = new CacheItemPolicy(); policy.AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10.0);
削除情報や有効期限情報が指定されない場合、既定値は InfiniteAbsoluteExpiration になり、キャッシュ内の項目が絶対時間に基づいて有効期限切れになることはなくなります。 この場合はメモリ圧迫の状態にある場合にのみ項目が期限切れになります。 ベスト プラクティスとして、常に絶対有効期限またはスライド式有効期限を明示的に指定してください。 このチュートリアルでは、10 秒の絶対有効期限を使用します。
監視するファイル パスのコレクションを作成してテキスト ファイルのパスをコレクションに追加するために、if/then ブロック内の前の手順で追加したコードの後に次のコードを追加します。
[Visual Basic]
Dim filePaths As New List(Of String)() Dim cachedFilePath As String = Server.MapPath("~") & _ "\cacheText.txt" filePaths.Add(cachedFilePath)
[C#]
List<string> filePaths = new List<string>(); string cachedFilePath = Server.MapPath("~") + "\\cacheText.txt"; filePaths.Add(cachedFilePath);
HttpServerUtilityMapPath() メソッドは現在の Web サイトのルートのパスを返します。
キャッシュ エントリの変更監視機能のコレクションに新しい HostFileChangeMonitor オブジェクトを追加するために、前の手順で追加したコードの後に次のコードを追加します。
[Visual Basic]
policy.ChangeMonitors.Add(New HostFileChangeMonitor(filePaths))
[C#]
policy.ChangeMonitors.Add(new HostFileChangeMonitor(filePaths));
HostFileChangeMonitor オブジェクトはテキスト ファイルのパスを監視し、変更が発生するとキャッシュに通知します。 この例のキャッシュ エントリはファイルの内容に変更があると自動的に有効期限が切れます。
テキスト ファイルの内容を読み取るために、前の手順で追加したコードの後に次のコードを追加します。
fileContents = File.ReadAllText(cachedFilePath) & vbCrLf & DateTime.Now.ToString()
fileContents = File.ReadAllText(cachedFilePath) + "\n" + DateTime.Now;
キャッシュ エントリの有効期限を特定するのに役立つ日付と時刻のタイムスタンプが追加されます。
ファイルの内容を CacheItem インスタンスとしてキャッシュ オブジェクトに挿入するために、前の手順で追加したコードの後に次のコードを追加します。
[Visual Basic]
cache.Set("filecontents", fileContents, policy)
[C#]
cache.Set("filecontents", fileContents, policy);
キャッシュ エントリの削除方法に関する情報を指定するため、CacheItemPolicy オブジェクトをパラメーターの Set メソッドとして渡します。
キャッシュしたファイルの内容を Label コントロールに表示するために、if/then ブロックの後に次のコードを追加します。
[Visual Basic]
Label1.Text = fileContents
[C#]
Label1.Text = fileContents;
ASP.NET Web サイトでのキャッシュのテスト
これで、アプリケーションをテストできるようになりました。
ASP.NET Web サイトでキャッシュをテストするには
Ctrl キーを押しながら F5 キーを押してアプリケーションを実行します。
[Get From Cache] をクリックします。
テキスト ファイルのキャッシュされた内容がラベルに表示されます。 ファイルの末尾にタイムスタンプがあることを確認します。
[Get From Cache] を再度クリックします。
タイムスタンプは変わりません。 これは、キャッシュされた内容が表示されていることを示します。
10 秒以上待機してから、[Get From Cache] を再度クリックします。
今度は新しいタイムスタンプが表示されます。 これはポリシーによって 10 秒後にキャッシュの有効期限が切れ、キャッシュされた新しい内容が表示されていることを示します。
テキスト エディターで、Web サイト プロジェクトに追加したテキスト ファイルを開きます。 まだ変更は加えないでください。
[Get From Cache] を再度クリックします。
タイム スタンプを再度確認します。
テキスト ファイルに変更を加え、ファイルを保存します。
[Get From Cache] を再度クリックします。
これによって、タイムスタンプが直ちに変わります。 これは、変更を加えたときにホストファイルの変更監視機能によってキャッシュ項目が直ちに削除されたことを示します。
注意
削除時間を 20 秒以上に長くすると、ファイルに変更を加える時間を長くすることができます。
コード例
このチュートリアルを完了すると、作成した Web サイトのコードは次の例のようになります。
Imports System.Runtime.Caching
Imports System.IO
Partial Class _Default
Inherits System.Web.UI.Page
Protected Sub Button1_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim cache As ObjectCache = MemoryCache.Default
Dim fileContents As String = TryCast(cache("filecontents"), _
String)
If fileContents Is Nothing Then
Dim policy As New CacheItemPolicy()
policy.AbsoluteExpiration = _
DateTimeOffset.Now.AddSeconds(10.0)
Dim filePaths As New List(Of String)()
Dim cachedFilePath As String = Server.MapPath("~") & _
"\cacheText.txt"
filePaths.Add(cachedFilePath)
policy.ChangeMonitors.Add(New _
HostFileChangeMonitor(filePaths))
' Fetch the file contents.
fileContents = File.ReadAllText(cachedFilePath) & _
vbCrLf & DateTime.Now.ToString()
cache.Set("filecontents", fileContents, policy)
End If
Label1.Text = fileContents
End Sub
End Class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Runtime.Caching;
using System.IO;
public partial class _Default : System.Web.UI.Page
{
protected void Button1_Click1(object sender, EventArgs e)
{
ObjectCache cache = MemoryCache.Default;
string fileContents = cache["filecontents"] as string;
if (fileContents == null)
{
CacheItemPolicy policy = new CacheItemPolicy();
policy.AbsoluteExpiration =
DateTimeOffset.Now.AddSeconds(10.0);
List<string> filePaths = new List<string>();
string cachedFilePath = Server.MapPath("~") +
"\\cacheText.txt";
filePaths.Add(cachedFilePath);
policy.ChangeMonitors.Add(new
HostFileChangeMonitor(filePaths));
// Fetch the file contents.
fileContents = File.ReadAllText(cachedFilePath) + "\n"
+ DateTime.Now.ToString();
cache.Set("filecontents", fileContents, policy);
}
Label1.Text = fileContents;
}
}
次の手順
ASP.NET では複数のキャッシュ実装を使用してデータをキャッシュできます。 詳細については、「Caching Application Data by Using Multiple Cache Objects in an ASP.NET Application (ASP.NET アプリケーションで複数のキャッシュ オブジェクトを使用してアプリケーション データをキャッシュする)」を参照してください。