ここ数日、asp.netの出力キャッシュについて考えています。私のタスクでは、非常に大きなプロジェクトの出力キャッシュを実装する必要があります。何時間も検索した後、例は見つかりませんでした。
出力キャッシュを使用する最も一般的な方法は宣言型です。この場合、キャッシュするページにこのようなものを書き込む必要があります。
ただし、サイト全体をキャッシュする必要がある場合は、プロジェクトのすべてのページまたはマスターページにこれを書き込む必要があります。狂気です。この場合、すべての構成を1か所に保存することはできません。すべてのページには独自の構成があります。
Global.asaxは私を助けることができますが、私のサイトには約20のWebプロジェクトと約20のglobal.asaxファイルが含まれています。そして、私は各プロジェクトに同じコードをコピーしたくありません。
これらの理由から、HTTPModuleを作成することにしました。Initメソッドでは、2つのイベントをサブスクライブします。
public void Init(HttpApplication app)
{
app.PreRequestHandlerExecute += new EventHandler(OnApplicationPreRequestHandlerExecute);
app.PostRequestHandlerExecute += new EventHandler(OnPostRequestHandlerExecute);
}
メソッド「OnPostRequestHandlerExecute」で、新しいリクエストごとに出力キャッシュパラメータを設定します。
public void OnPostRequestHandlerExecute(object sender, EventArgs e)
{
HttpApplication app = (HttpApplication)sender;
HttpCachePolicy policy = app.Response.Cache;
policy.SetCacheability(HttpCacheability.Server);
policy.SetExpires(app.Context.Timestamp.AddSeconds((double)600));
policy.SetMaxAge(new TimeSpan(0, 0, 600));
policy.SetValidUntilExpires(true);
policy.SetLastModified(app.Context.Timestamp);
policy.VaryByParams.IgnoreParams = true;
}
「OnApplicationPreRequestHandlerExecute」メソッドで、calbackメソッドをキャッシュ検証に設定しました。
public void OnApplicationPreRequestHandlerExecute(object sender, EventArgs e)
{
HttpApplication app = (HttpApplication)sender;
app.Context.Response.Cache.AddValidationCallback(new HttpCacheValidateHandler(Validate), app);
}
そして最後の部分-コールバック検証メソッド:
public void Validate(HttpContext context, Object data, ref HttpValidationStatus status)
{
if (context.Request.QueryString["id"] == "5")
{
status = HttpValidationStatus.IgnoreThisRequest;
context.Response.Cache.AddValidationCallback(new HttpCacheValidateHandler(Validate), "somecustomdata");
}
else
{
status = HttpValidationStatus.Valid;
}
}
HttpModuleをアタッチするには、プログラムでattachメソッドを使用します。
[assembly: PreApplicationStartMethod(typeof(OutputCacheModule), "RegisterModule")]
この方法は完全に機能しますが、これを行う他の方法があることを知りたいです。ありがとう。