IIS7.5 OutputCacheModuleカーネルキャッシュ「パブリック」はURLを無視します
-
09-10-2019 - |
質問
IIS 7.5のASP.NET 4アプリケーションでの出力キャッシュに関する奇妙な動作をしてください。他の空のセットアップで問題を繰り返すことができましたが、これはバグだと確信していますが、Microsoftに報告する方法がわかりません。
IISのサイトは1つ以上のドメインに応答し、.NETアプリケーションはホスト名を調べ、それに応じてコンテンツを作成します。たとえば、要求URLの名前を空白ページに印刷する場合があります。たとえば、www.first-domain.com、およびwww.second-domain.com
web.configには、適切なキャッシュ、urlcompression、およびhttpcompressionがすべてSystem.webserverノードの下でオフになります。
ASPXページは、有効期限の将来の日付または最大年齢の価値を持つキャッシュコントロールヘッダーを公開するために設定します。
www.first-domain.comにアクセスすると、「www.first-domain.com」を正常に書き込むページが出力されます。
ただし、www.second-domain.comにアクセスすると、「www.first-domain.com」を書き込むページが出力されます。
失敗したリクエストトレース、System.Web.Caching.OutputCacheModuleがキャッシュ出力を発見しました(.configファイルが関数をオフにしているにもかかわらず) 2番目の要求は、2番目のドメインの正しいページが表示される前に、最大年齢/有効期限が設定されている限り、最初の要求の結果を異なるドメインに出力します。
キャッシュコントロールをプライベートに設定するか、web.configで「outputcache」モジュールを削除するか、問題を解決し、ブラウザに送信された正しいキャッシュコントロールヘッダーを維持しますが、明らかに、カーネルキャッシングを利用することはできません。それが必要。
outputCacheModuleの構成方法に関するMSDNドキュメントは見つかりません。
他の誰かがこの問題を経験したことがありますか?カーネルキャッシングを有効にして、URLホスト名を考慮に入れてください(IISの異なるサイトにアプリケーションを分離せずに)。
ありがとう。
アップデート:
kernalキャッシュはリクエストホスト名に関係なく出力をキャッシュしているため、SetSlidingExpirationを追加しても効果はありません。現在、唯一のシナリオは、出力キャッシュを無効にするか、各ドメインでアプリの複製インスタンスを実行することです。サーバーパフォーマンスの低下を考慮すると、出力キャッシュの使用で得られるパフォーマンスの増加が得られます。このアプリの出力キャッシュを無効にするため。
解決
9か月後には回答が提供されておらず、解決策は見つかりませんでした。
--
kernalキャッシュはリクエストホスト名に関係なく出力をキャッシュしているため、SetSlidingExpirationを追加しても効果はありません。現在、唯一のシナリオは、出力キャッシュを無効にするか、各ドメインでアプリの複製インスタンスを実行することです。サーバーパフォーマンスの低下を考慮すると、出力キャッシュの使用で得られるパフォーマンスの増加が得られます。このアプリの出力キャッシュを無効にするため。
他のヒント
私は非常によく似た問題を抱えていて、ここに解決策は助けになりませんでした。
tldr: :強制的に削除します OutputCache
のモジュール Web.config
私が見つけた唯一の解決策でした。
私のシナリオは少し違っていました。
私はCORSを設置しています Application_BeginRequest
, 、答えます Access-Control-Allow-Origin
私を呼ぶ特定のホストのために(それを設定する *
信頼できていません)。
私のコントローラーも設定します Cache-control: public
それは応答です。
私が見つけたもの
設定するたびに Cache-control: public
, 、IISは反応を強制的にキャッシュします。どちらかのブレークポイント Application_BeginRequest
または、私のコントローラーが二度目にヒットすることはありませんでした。
見たように、IISマネージャーを介した出力とカーネルキャッシュの無効化 下 私を打つでしょう Application_BeginRequest
ブレークポイントですが、私をコントローラーに入れることはありませんでした。何かがまだキャッシュ応答でした。
この記事 IISからoutputCacheモジュールを削除することをお勧めします。
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<remove name="OutputCache" />
</modules>
</system.webServer>
そうすることで、最終的にコントローラーを打つことができました。
さらに役立つのは何ですか
MSの誰かがこの動作を変える方法があるかどうかにかかわらず、光を照らすことができる場合。 outputCacheは、アプリケーションの一部で役立ち、他の部分では不要です。
注意してください
たぶん私は(私たちは)ここで間違った問題を解決しています。
たぶん、IISはこのシナリオでキャッシュを引き継いでいたのかもしれません。たぶん、私のサーバーとユーザーの間の途中でプロキシは、その正確なシナリオでそのように振る舞うでしょう。もしそうなら、IISでこれを回避することは間違っています。私はそれを理解する必要があります、そして多分あなたもそうすべきです。
同様の問題があります。カスタムURLライターを使用しています。 pages example.com/articlesとexample.com/art-any_id.htmlがあります。両方のURLマップ。ASPX(記事として2番目の例では、aspx?id = any_id)。 ASP.NET 2.0およびクラシックパイプラインモードで正常に機能しました。 ASP.NET 4と統合モードに変更した後、奇妙な動作があります。両方のURLが同じ出力を返します。 example.com/art-any_id.htmlのようなページでした。
今、私たちは削除しました <add extension=".html" policy="CacheUntilChange" kernelCachePolicy="CacheUntilChange" />
セクションから <caching enabled="true" enableKernelCache="true">
そして、それはうまく機能します。なぜhttp.sysキャッシュする理由がわかりません。
説明はありますか?