49

Ultra-Fast ASP.NET: Chapter 3 - Cachingによると:

ブラウザがサーバーから取得するファイルは、サーバーのラウンドトリップを最小限に抑えるために、可能な限りブラウザのキャッシュに保存する必要があります。

  • しかし、IIS はどのようにして静的コンテンツが実際に何が静的コンテンツであり、何がそうでないかを判断するのでしょうか?

    画像、CSS、JS だけで、ASPX、ashxではありませんか?

    すでに静的と見なされているものとそうでないものを IIS のどこで確認できますか?

  • <%@ OutputCacheページがヘッダー付き (なしlocation)で宣言されているシナリオはどうですか? そのimages中のCSSJSソース ファイル同じプロパティで出力キャッシュされていますか?

  • ベスト プラクティスとして、最大有効期限として 1 年先を設定する必要があります。サイト上のすべての静的コンテンツのデフォルトとしてそれを使用する必要があります

だから私はこれをしました:

一般的な HTTP 応答ヘッダーを設定する

しかし後で、 を押した後、OK応答ヘッダー (この場合はフォルダー) を既に送信した相手を示す要約メニューが見つかりません。css

現在cssフォルダーに応答ヘッダーが適用されていることを確認するには、もう一度cssフォルダーに移動する必要がありますHttp 応答ヘッダー共通ヘッダーを設定すると、それが表示されます。web.configには書かれていません。 -->-->-->

しかし、ファイルに対してそれを行うと(Login.aspxたとえば):web.configに表示されます:

<configuration>
    <location path="Login.aspx">
        <system.webServer>
            <staticContent>
                <clientCache cacheControlMode="UseExpires" cacheControlMaxAge="1.00:00:00" httpExpires="Fri, 15 Feb 2013 00:00:00 GMT" />
            </staticContent>
        </system.webServer>
    </location>
</configuration>
4

2 に答える 2

75

私はあなたの状況を理解しています。IIS がファイルを処理する方法がわかりにくい場合があります。また、IIS 6 と IIS 7 では異なり、クラシック アプリケーション プールと統合モード アプリケーション プールでも異なります。私の経験は主に IIS 7.5 の統合アプリケーション プールに関するものであるため、この環境について最も正確にコメントできます。

最初の質問

しかし、IIS は実際に静的コンテンツとそうでないものをどのように認識しているのでしょうか。

ASPX 、 ashx ではなく、 images 、 css 、 js だけですか?

すでに静的と見なされているものとそうでないものを IIS のどこで確認できますか?

Web サイトに移動して [ハンドラー マッピング] をクリックすると、IIS のファイル ハンドラーのリストを調べることができます。デフォルトでは、これらは .Net フレームワークのバージョンによって異なる場所にある .Net ベースの web.config から継承されます。

  • C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\web.config
  • C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\web.config

要求されたファイルがまだ別のハンドラーに明示的にマップされていない場合*、最後のオプション ( ) として、System.Web.DefaultHttpHandlerそれが静的ファイルまたはディレクトリ ブラウジング要求であるかどうかを判断するすべてのハンドラーをキャッチ ( ) になります。したがって、静的ファイルは、別のハンドラーにまだバインドされていない単なるファイルです。たとえば、このデフォルト ハンドラーの前に*.aspx既にマップされていることがわかります。System.Web.UI.PageHandlerFactoryしたがって、そのハンドラーによって処理され、静的ファイルとは見なされません。そのマッピングを削除すると、必要に応じて技術的に *.aspx を静的ファイルとして提供できます (それがどのように機能するかを証明するためだけに)。

System.Web.StaticFileHandlerただし、IIS でファイル拡張子をマッピングする web.config の httpHandlers セクションにエントリを追加することにより、ファイルの種類を静的ファイルとして明示的に一覧表示することもできます。例えば:

<configuration>
  <system.webServer>
    <handlers>
      <add name="StaticHandler" verb="*" path="*.zip" type="System.Web.StaticFileHandler" preCondition="integratedMode" />
    </handlers>
  </system.webServer>
</configuration>

この例では<system.webServer>config セクションを使用しているため、統合モードで実行されているアプリケーション プール用です。

2 番目の質問

ページが <%@ OutputCache header(without location) で宣言されているシナリオはどうですか。その中の画像、css、js srcファイルも同じプロパティで出力キャッシュされていますか?

いいえ。ページは別のリクエストとして (おそらく別のハンドラーによって) サーバーに送られるため、まったく異なるキャッシュ ヘッダー/ヒントを持つことができます。ホスト ページとそれが使用する可能性のあるリソースは、キャッシュの観点からは関係ありません。

実際、*.html のキャッシュ期間を短くし、*.jpg または *.png のキャッシュ期間を長くしたい場合もあります。考慮すべきこと。

3 番目の質問

最善の方法として、最大の有効期限として 1 年先を設定する必要があります。これを、サイトのすべての静的コンテンツのデフォルトとして使用する必要があります。

うーん…1年も行かないかも。1ヶ月くらい?次のようなグローバル ポリシーを設定します。

<configuration>
  <system.webServer>
    <staticContent>
      <!-- Set expire headers to 30 days for static content-->
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="30.00:00:00" />
    </staticContent>
  </system.webServer>
</configuration>

これは上に示したサンプルと同じですが、<location>要素内ではなく、ルート<configuration>要素内にあるため、デフォルト ポリシーです。繰り返しますが、これはIntegrated Modeで実行されている App Pool 用です。場合によっては、以下もオンにする必要があります。

<configuration>
    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true">
            <!-- stuff -->
        </modules>
    </system.webServer>
<system.webServer>

これにより、静的ファイルが上記の構成要素を尊重する管理された静的ファイル ハンドラーを介して処理されるようになります。

編集してコメントに対処する

上記で投稿した構成ダイアログのドキュメントは、HTTP Expires 応答ヘッダーの構成 (IIS 7)にあります。

どうやらこれらの設定はC:\Windows\System32\inetsrv\config\applicationHost.configに保存されているようです

私は IIS7 を持っておらず、現在 IIS 7.5 で個人的に開発しています。この場所が正確であることを確認できる場合は、コメントを投稿してください。

于 2013-01-11T01:15:42.557 に答える
4
  1. 静的コンテンツは、IISが読み取られ、処理なしでブラウザーに送信されるコンテンツです。そこで、IISをセットアップしCache-Control Headerて、クライアントのブラウザーコンピューターにキャッシュするためのいくつかを含めることができます。
  2. あなたが言うように、IISを直接セットアップすることによってそのエーテルを行うことができ、コマンドをオンにすることによってエーテルを行うことができweb.configます。web.configに追加してIISに関係するコマンドは、asp.net自体とは関係ありませんでしたが、IISとIISは構成を別のファイルに保存するため、キャッシュ制御ヘッダーを直接変更するとIISは、web.configには表示されません。
  3. 現在、画像、CSS、JavaScript、およびその他の同様のファイルなどの静的コンテンツについては、10年の有効期限を追加することで「有効期限が切れない」ポリシーに従うことができると言われています。
  4. ここでの問題は、静的ファイルの内容を変更できない場合、たとえば10年のJavaScriptファイルをキャッシュし、それに小さな変更を加えた場合、ファイル名を変更するためにetherが必要になることです。最後にパラメータを追加します。
  5. これ<%@ OutputCacheで、コントロール上のはクライアントではなくサーバーキャッシュを参照します。実際に行われるのは、サーバー上のコントロールのレンダリングをキャッシュすることです。これにより、次にレンダリングする時間を無駄にしないように要求したときに、次のように読み取ります。キャッシュから-それでもブラウザに送信されます。

また、この回答をさらに読むこともできます。IIS(動的および静的)キャッシュ、OutPutCache、およびブラウザーキャッシュの違いは何ですか。

于 2013-01-08T10:25:34.170 に答える