ARR - 特定のリクエスト(認証されたユーザー)のディスク キャッシュを動的に無効にする

ARR - 特定のリクエスト(認証されたユーザー)のディスク キャッシュを動的に無効にする

これは、アプリケーション リクエスト ルーティングと、特定のリクエスト (リクエストが認証されたユーザーから送信され、認証されているかどうかはカスタム コードによって決定できる) に対するディスク キャッシュの動的な無効化に関するものです。

私のセットアップでは、ARR を実行するサーバーがあり、別のサーバー上の ASP.NET MVC サイトに要求をディスパッチします。このサイトではフォーム認証 (場合によっては HTTP 基本認証) が使用されるため、認証は ARR ではなく MVC サイトで行われます。基本的に、ユーザーが認証すると、サイトはフォーム認証 Cookie を作成します。

ARR で次のことが起こることを望みます:

  • 匿名ユーザーに対して出力キャッシュを実行します。
  • 認証されたユーザーの場合、静的ファイル (.css、.js、.jpg ファイルなど) のみをキャッシュし、動的ページはキャッシュしません。

このシナリオでキャッシュ構成ルールを設定するにはどうすればよいでしょうか? 複数の方法を試しました:

  • キャッシュ ヘッダー: MVC アプリによって送信されたキャッシュ コントロール ヘッダーはここでは使用できません。これは、次のような状況を想像してください。ページ 1 は ARR のキャッシュにあります。ユーザーは認証してページ 1 にアクセスします。MVC アプリはキャッシュなしのヘッダーを送信しますが、リクエストが到達しないため、ユーザーはキャッシュされたバージョンを取得します。
  • キャッシュなしの URL: 「no-arr-cache」を含む URL はキャッシュしないように定義すると、URL 書き換えで機能すると思われます。つまり、カスタム URL 書き換えプロバイダーを使用して、認証されたリクエストを ...?no-arr-cache に書き換えます。ARR キャッシュ制御ルールがクエリ文字列を考慮しないこととは別に、問題は、ARR がキャッシュ構成ルールを評価するときに、書き換えられた URL ではなく、要求された URL のみを考慮することです。

よろしくお願いします!

私はこれをクロスポストしましたIIS フォーラム誰も返信しなかったからです。

答え1

これが私が解決した方法です。

次の前提を念頭に置く必要があります。

  • ARR は、キャッシュされたアイテムを URL で識別します (構成に応じて、クエリ文字列が含まれます。これが構成である必要があります)。
  • リクエスト中、ARR は現在のリクエストの出力をキャッシュしないように指示できます。
  • 現在のリクエスト (URL) の出力が以前にキャッシュされていた場合、キャッシュされたバージョンを使用しないように ARR に指示する方法は私の知る限りありません。

重要なアイデアは、リクエストの URL を変更することです。つまり、ユーザーが認証されているかどうかに応じて、IIS URL 書き換えを使用して URL を異なる方法で書き換えます。認証されていないユーザーには、たとえば /my-page?authenticated=false で提供されるすべてのページが、認証されたユーザーには /my-page?authenticated=true で提供されるすべてのページが提供されます。ページは匿名ユーザーに対してのみキャッシュされるため、ARR は認証されたユーザーに対して一致するキャッシュ エントリを見つけることができません。したがって、3 番目のポイントは解決されます。欠点としては、URL に添付するクエリ文字列が HTML 本文に表示されることがあり、IIS URL 書き換えを使用してこれらを削除する必要があります。

ARR に現在のリクエストをキャッシュしないように指示するには、ARR_CACHE_CONTROL_OVERRIDE サーバー変数を「1,no-cache」に設定します (これは書き換えルールから実行できます)。

ユーザーがIIS URL Rewrite IRewriteProviderから認証されているかどうかを検出できます(チュートリアルつまり、このようなプロバイダーの出力を使用して、認証されたユーザーと匿名ユーザーに対して URL を異なる方法で書き換えることができます。

誰かの役に立つことを願います。

関連情報