最近、オブジェクトのキャッシングを試してみましたが、HttpRuntime.Cache
一般的に、キャッシュに何かを「追加」すると、次のようになるという印象を受けました。
HttpRuntime.Cache.Insert("Test", "This is a test!", null,
Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration,
CacheItemPriority.NotRemovable, new CacheItemRemovedCallback(FileChanged));
「NotRemovable」フラグと「NoExpiration」フラグは、アプリケーションの期間中、オブジェクトをメモリ内に保持します。しかし、特定のページ リクエストの最後に、HttpRuntime.Cache が完全に空になることがわかりました。
コールバック「FileChanged」内でトレースしてブレークポイントを設定すると、実際に何かがオブジェクト(およびキャッシュ内の他のすべてのオブジェクト)を「削除」していることがわかりましたが、その理由はわかりませんでした。そのため、最終的には、このサブシステムに影響を与える可能性があると思われる他のものを無効にし始めました.
最終的に、次の行をコメントアウトしました。
WebConfigurationManager.OpenWebConfiguration("~").Save;
私は主に AppSettings 領域の「web.config」からデータを取得していましたが、時々 AppSettings に書き戻し、上記のコマンドを使用して変更を保存しました。「web.config」がキャッシュされていることを読んで知っていましたが、変更を保存しても HttpRuntime.Cache のすべてがフラッシュされないはずですよね?
これはバグですか?それとも、2 つのキャッシュは何らかの方法でリンクされているのでしょうか。
編集:
わかりました、誰かが自分のマシンでこれを試してみたい場合は、これを非常に再現可能にしました. (私は .NET 3.5 をターゲットとする MVC2 を使用して VS2008 Pro を実行しています) 新しい MVC2 プロジェクトを開始し、既存のHomeController
ものの上に以下を貼り付けます。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Configuration;
using System.Configuration;
namespace BackButtonTest.Controllers
{
[HandleError]
public class HomeController : Controller
{
private string MESSAGE = "Message";
public ActionResult Index()
{
ViewData[MESSAGE] = HttpRuntime.Cache.Get(MESSAGE);
Configuration Config = WebConfigurationManager.OpenWebConfiguration("~");
Config.AppSettings.Settings.Add("SomeKey", "SomeValue");
Config.Save();
return View();
}
public ActionResult About()
{
HttpRuntime.Cache[MESSAGE] = "This is pulled from the HttpRuntime.Cache";
return View();
}
}
}
次に、次の手順に従います。
- アプリをデバッグモードで起動します。
- 「概要」リンクをクリックします。これにより、文字列がキャッシュにロードされます。
- 「ホーム」リンクをクリックします。文字列はキャッシュから取得され、ViewMessage ディクショナリにスタックされます。一部のキーと値のペアが web.config に書き込まれ、保存されます。キャッシュからの文字列がホームページに表示されます。
- 「ホーム」リンクをもう一度クリックします。文字列はキャッシュから取得する必要がありますが、そうではありません。
- プログラムを停止します。「Config」で始まる 3 行をコメントアウトします。プログラムを再起動します。
- 手順 1 ~ 4 をもう一度試してください。HttpRuntime.Cache が空になっていないことに注意してください。
変でしょ?