キャッシング、特にコントロールを使用した部分キャッシングについて学ぼうとしています。
私のウェブサイトは特定のページで動作が遅いため、できるだけ多くのキャッシュが役立ちます.
SO で見つけたコードやその他のさまざまな Google の結果から多くの実験を実行したところ、動的に追加されたコントロールで問題が発生しています。
このコードを含む簡単なページをセットアップしました。
<%@ Page Language="VB" Debug="true" %>
<%@ Register TagPrefix="controls" TagName="control" Src="~/test/control.ascx" %>
<script runat="server">
Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
Label2.Text = "Present Time: "
Label2.Text += DateTime.Now.ToString()
End Sub
</script>
<html>
<body>
<form id="form1" runat="server">
<div>
<h2 style="color:Red">Output Caching</h2>
<asp:Label ID="Label2" runat="server"></asp:Label>
<controls:control ID='control1' runat='server' />
'------------------------------------------
<hr />
<div id='dyn2' runat='server' />
</div>
</form>
</body>
</html>
コントロールcontrol.ascx
は次のようになります。
<%@ Control Language="VB" ClassName="control" %>
<%@ OutputCache Duration="60" VaryByParam="r" %>
<script runat="server">
Sub Page_Load() Handles Me.Load
controlContent.InnerHtml = "Control time: " & DateTime.Now.ToString()
End Sub
</script>
<div id="controlContent" runat="server"></div>
これはうまく機能し、ページに「ライブ」時間を提供しますが、キャッシュされたコントロールには、OutputCache
宣言に従って60秒が経過した後にのみ更新される時間が表示されます。
<controls>
ページの一部をキャッシュする必要があり、その部分がタグを使用してページに明示的に入力されている場合に、これを任意のアプリケーションに使用する方法を確認できます。このvaryByParam
オプションは私にとっても便利です。(まだ調べてませんvaryByCustom
!)
ただし、場合によっては、特定のニーズに基づいてプログラムでコントロールをページにロードしています。
この場合、次のようなコードを使用します。
Dim theResult As test_control2 = CType(LoadControl("~\test\control2.ascx"), test_control2)
dyn2.Controls.Add(theResult)
これは、 「dyn2」control2.ascx
で divに想像力を働かせる 2 番目のテスト コントロールをプログラムで追加しています。id
コントロールにキャッシュ ディレクティブ ヘッダーがない場合、またはコード ビハインドの場合、すべて正常に動作しますが、(ページ全体をキャッシュしない限り) キャッシュできません。
ただし、上記の制御コードに従ってキャッシュ ヘッダーを追加すると、次のエラーが発生します。
Unable to cast object of type 'System.Web.UI.PartialCachingControl' to type 'test_control2'.
グーグルはこれであまり役に立たないようで、PartialCachingControl
型を調査するとさらに問題が発生します!
これらのコントロールをキャッシュできるようにするために何をすべきか教えてもらえますか?
問題があれば、私は VB.net でコーディングしており、.NET 2.0 も使用しているため、該当する場合は、このプラットフォームの制限に関するアドバイスもいただければ幸いです。