none
ASP.NETのOutputCacheの利用方法について(長文です。) RRS feed

  • 質問

  • みさなんこんばんわ。

    ASP.NETのページキャッシュについて
    質問があります。

    要件が実現できるかどうかの検証を行っております。

    ページ構成>
    ①マスタページ:site.Master
    ⇒マスタページにはメニュ(LinkButton)が3つある。
    (M1,M2,M3)
     
    ②コンテンツページ
    ⇒①のメニュと連動させたいページが3つあります。
    (C1,C2,C3)
    各コンテンツページにはテキストボックスとGridViewなどを設置しております。

    要件>
    ・②のページ単位でレンダリング状態をキャッシュし
    ある期間だけサーバへの通信させずに、キャッシュからレンダリングさせる。
    ・キーワードでキャッシュをページ単位で、複数を持たせたい。

    以下要件のイベント遷移
    例)
    1)メニュ「M1」を選択し、コンテンツ「C1」へ遷移する。
    2)「C1」ページのテキストボックスへ何か入力

    3)メニュ「M2」を選択し、コンテンツ「C2」へ遷移する。
    4)「C2」ページのテキストボックスへ何か入力

    5)メニュ「M3」を選択し、コンテンツ「C3」へ遷移する。
    6)「C3」ページのテキストボックスへ何か入力

    7)メニュ「M1」を再度選択し、コンテンツ「C1」へ遷移する。
    ⇒この時、2)のテキスト入力後状態で復元させたい。

    8)メニュ「C2」「C3」を同様に復元したい。

    ・ページ遷移は LinkButtonのクリックイベントで
     Response.Rediret()で遷移させる。

    ・遷移先のページのPage_Loadで
    ポストバック時に、コードで設定。
    キャッシュの保存場所を「サーバ」
    キーワードを「hidTest」とし、画面上のHidden項目に
    前画面からのPOST値をセットし、キャッシュを複数管理させております。

     
    質問概要>
     キーワード利用による、各ページ単位のN個キャッシュ保持が実現できておりますが、
     イベント遷移例 7)の様なほかのページへ遷移し、元の画面を表示する場合、
     キャッシュが有効とならずに、Page_Loadイベントが走ってしまう。
     
      ①要件を満たすべく、ページキャッシュの推奨方法を確認したい。
    ②ページキャッシュの解除方法も知りたい。(ページのN個全部かキーワードで個別 )
    ③キャッシュできるデータについて
    HTMLのみで、表示後の入力内容は保持できないのでしょうか?
    ④コンテンツページでキャッシュさせた場合、マスタページを含めたページ全体が
    キャッシュされるのでしょうか?それともコンテンツページだけでしょうか?

    環境>
    VS2010 sp1未適応
    ソリューション:webアプリケーション
    言語:C#
    ターゲット:ASP.NET4 .netframework4
    OS win7
    使用ブラウザ:IE8、FF5

     

    2011年8月4日 14:42

回答

  • まずキャッシュには3段階あります。

    1. Webブラウザーが保持するキャッシュ
    2. Proxyサーバーが保持するキャッシュ
    3. IIS内で保持するキャッシュ

    質問を読む限り1.を期待しているようですが、OutputCacheは1.~3.を統一的に制御します。

    また、キャッシュを制御するのはASP.NETですが、Webブラウザー・Proxyサーバー・IISがページを識別するのはURL+αです。何を言いたいかというと、ポストバックとかASP.NET特有の情報をキーにしてキャッシュ対象を指定することはできません。

    このまま説明を続けてもいいですが、まずはこの前提条件を把握し、何をどうキャッシュしたいのかをもう一度整理された方がいいと思います。

    これとは別にページ間の整合性の問題もあります。例えばページA、B、Cがあった時に、アクセスしたページだけがキャッシュされるため、3ページとも同じバージョンがキャッシュされるとは限りません。そのような状況が好ましくない場合、キャッシュされないようにする必要が出てきます。

    # 更にコンテンツ圧縮を含めると…。

    • 回答の候補に設定 山本春海 2011年8月25日 2:42
    • 回答としてマーク 山本春海 2011年8月30日 5:56
    2011年8月4日 16:20
  • いろいろ書いてあって、やりたいことが読みきれていませんが、要するに、

    > 2)「C1」ページのテキストボックスへ何か入力

    され、

    > 3)メニュ「M2」を選択し、コンテンツ「C2」へ遷移する。
     
    と、LinkButton クリックでポストバックがかかるので、その時ポストさ
    れた TextBox.Text の値をサーバー側で DB なり Session なりに保存し、
    そのページキャッシュを破棄する。

    その後、

    > 7)メニュ「M1」を再度選択し、コンテンツ「C1」へ遷移する。

    際は、キャッシュが破棄されているので新たにページを再生成するが、
    TextBox.Text は上記の操作で DB なり Session なりに保存された
    データを設定したい・・・ということですか?


    そのために、

    > ・遷移先のページのPage_Loadで
    >  ポストバック時に、コードで設定。
    >  キャッシュの保存場所を「サーバ」
    >  キーワードを「hidTest」とし、画面上のHidden項目に
    >  前画面からのPOST値をセットし、キャッシュを複数管理させております。

    というようなことをしていて、その結果、

    > キャッシュが有効とならずに、Page_Loadイベントが走ってしまう。

    ということになるが、TextBox.Text には 2) で設定した値にならなくて
    悩んでいるということでしょうか?


    上記の、「・遷移先のページのPage_Loadで・・・」で具体的にどのように
    しているか、詳細を書いていただけませんか。

     

    • 回答としてマーク 山本春海 2011年8月30日 5:56
    2011年8月6日 8:23

すべての返信

  • まずキャッシュには3段階あります。

    1. Webブラウザーが保持するキャッシュ
    2. Proxyサーバーが保持するキャッシュ
    3. IIS内で保持するキャッシュ

    質問を読む限り1.を期待しているようですが、OutputCacheは1.~3.を統一的に制御します。

    また、キャッシュを制御するのはASP.NETですが、Webブラウザー・Proxyサーバー・IISがページを識別するのはURL+αです。何を言いたいかというと、ポストバックとかASP.NET特有の情報をキーにしてキャッシュ対象を指定することはできません。

    このまま説明を続けてもいいですが、まずはこの前提条件を把握し、何をどうキャッシュしたいのかをもう一度整理された方がいいと思います。

    これとは別にページ間の整合性の問題もあります。例えばページA、B、Cがあった時に、アクセスしたページだけがキャッシュされるため、3ページとも同じバージョンがキャッシュされるとは限りません。そのような状況が好ましくない場合、キャッシュされないようにする必要が出てきます。

    # 更にコンテンツ圧縮を含めると…。

    • 回答の候補に設定 山本春海 2011年8月25日 2:42
    • 回答としてマーク 山本春海 2011年8月30日 5:56
    2011年8月4日 16:20
  • いろいろ書いてあって、やりたいことが読みきれていませんが、要するに、

    > 2)「C1」ページのテキストボックスへ何か入力

    され、

    > 3)メニュ「M2」を選択し、コンテンツ「C2」へ遷移する。
     
    と、LinkButton クリックでポストバックがかかるので、その時ポストさ
    れた TextBox.Text の値をサーバー側で DB なり Session なりに保存し、
    そのページキャッシュを破棄する。

    その後、

    > 7)メニュ「M1」を再度選択し、コンテンツ「C1」へ遷移する。

    際は、キャッシュが破棄されているので新たにページを再生成するが、
    TextBox.Text は上記の操作で DB なり Session なりに保存された
    データを設定したい・・・ということですか?


    そのために、

    > ・遷移先のページのPage_Loadで
    >  ポストバック時に、コードで設定。
    >  キャッシュの保存場所を「サーバ」
    >  キーワードを「hidTest」とし、画面上のHidden項目に
    >  前画面からのPOST値をセットし、キャッシュを複数管理させております。

    というようなことをしていて、その結果、

    > キャッシュが有効とならずに、Page_Loadイベントが走ってしまう。

    ということになるが、TextBox.Text には 2) で設定した値にならなくて
    悩んでいるということでしょうか?


    上記の、「・遷移先のページのPage_Loadで・・・」で具体的にどのように
    しているか、詳細を書いていただけませんか。

     

    • 回答としてマーク 山本春海 2011年8月30日 5:56
    2011年8月6日 8:23
  • こんにちは、関西人のおっさんT さん。

    MSDN フォーラムのご利用ありがとうございます。オペレーターの山本です。
    しばらく時間が経ちましたが、その後いかがでしょうか。

    みなさんから参考になるアドバイスをいただいているようでしたので、勝手ながら私のほうで一旦回答としてマークさせていただきました。
    佐祐理 さん、SurferOnWww さん、アドバイスありがとうございます。

    もしまだ問題を解決されていないようであれば、みなさんからのアドバイスを参考に、一度質問内容を整理して質問を続けてくださいね。
    よろしくお願いいたします。
                                                                   
    日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海

    2011年8月30日 6:01