2

私の仕事のアーキテクトは最近、JavaScript、CSS、画像などのページで使用されるリソースに遠い将来のExpiresヘッダーを使用するように指示されているYahoo!の優れたパフォーマンスのベストプラクティスガイドを読みました。アイデアは、これらのリソースのExpiresヘッダーを数年先に設定して、常にブラウザーによってキャッシュされるようにすることです。ファイルを変更するため、キャッシュを使用する代わりにブラウザーがリソースを再度要求する必要がある場合は、ファイル名を変更してください。バージョン番号を追加します。

これをビルドプロセスに組み込む代わりに、彼は別のアイデアを持っています。ビルドごとにソースとサーバーディスクのファイル名を変更する代わりに(当然のことながら、面倒です)、偽造します。彼の計画は、上記のリソースに遠い将来の有効期限を設定してから、2つのHttpModuleを実装することです。

1つのモジュールが、ASPXページとHTMLページのすべての応答ストリームをインターセプトしてから送信し、リソースリンクを探して、ファイルの最終変更日であるバージョンパラメーターを追加します。他のHttpModuleは、リソースに対するすべての要求を処理し、アドレスのバージョン部分を単に無視します。これにより、ブラウザは、ディスク上のファイルの名前を実際に変更しなくても、ディスク上で変更されるたびに常に新しいリソースファイルを要求します。

わかる?

私の懸念は、ASPX/HTMLページの応答ストリームを書き換えるモジュールに関連しています。<script>彼は、タグの「src」属性と<img>タグの「href」属性に一連のRegex.Replace()を適用するだけ<link>です。これは、コンテンツタイプが「text/html」であるサーバー上のすべてのリクエストに対して発生します。潜在的には1分あたり数百または数千。

HttpModulesがIISパイプラインにフックされていることは理解していますが、これにより、IISがHTTP応答を送信するのにかかる時間に法外な遅延が追加される必要があります。いいえ?どう思いますか?

4

3 に答える 3

1

次の点に注意してください。

  1. バージョンを示すために静的ファイル名にクエリ文字列を追加することを考えている場合、残念ながら、カーネルモード HTTP ドライバー (http.sys) によるキャッシュも妨げられます。
  2. 一連の正規表現に基づいて各応答全体をスキャンすると、遅く、遅く、遅くなります。また、予測が困難な特殊なケースでは、信頼性が低くなる可能性があります。

いくつかの選択肢:

  1. コントロール アダプターを使用して、特定の URL またはパスを現在のバージョンに明示的に置き換えます。これにより、特に画像、CSS などに集中できます。
  2. 静的ファイルのバージョンを変更するときに、ファイル名ではなくフォルダー名を変更する
  3. ファイル名を一元化するために、ASP.NET スキンの使用を検討してください。これにより、メンテナンスが簡素化されます。

お役に立てれば、私の本 ( Ultra-Fast ASP.NET ) で、コード例を含めてこの件について説明します。

于 2009-11-18T02:35:24.483 に答える
0

http://code.google.com/p/talifun-web

StaticFileHandler - キャッシュ可能で再開可能な方法で静的ファイルを提供します。CrusherModule - 圧縮されたバージョン管理された JS と CSS をキャッシュ可能な方法で提供します.

カーネル モードのキャッシュ速度はあまり得られませんが、HttpRuntime.Cache からのサービスには利点があります。カーネル モード キャッシュは部分的な応答をキャッシュできず、キャッシュをきめ細かく制御することはできません。実装する最も重要なことは、一貫した etag ヘッダーと expires ヘッダーです。これにより、サイトのパフォーマンスが何よりも向上します。

提供されるファイルの数を減らすことは、おそらく Web サイトの速度を改善する最良の方法の 1 つです。CrusherModule は、サイトのすべての css を 1 つのファイルに結合し、すべての js を別のファイルに結合します。

メモリは安く、ハード ドライブは遅いので、使用してください。

于 2010-02-18T15:13:05.803 に答える
0

彼は、クライアントに何かがキャッシュされていないことを心配しています - 明らかに、これはユーザー集団がブラウザーをどのように構成しているかに多少依存します。それがデフォルトの構成であれば、クライアントのキャッシュを推測しようとすることを心配する必要はないと思います。それは難しすぎて、結果が保証されていません。また、新しいユーザーには役立ちません。

HTTP モジュールに関する限り、基本的には問題ないと思いますが、その道を歩むなら、目がくらむほど高速で効率的である必要があります。おそらく試してみる価値があります。ただし、内部でやりたいことを行うために RegEx を使用することの適切性について話すことはできません。

高性能を求めている場合は、あなた (またはあなたのアーキテクト) に読んでもらうことをお勧めします (悪い意味で言っているのではありません)。最近、役立つと思うことを学びました-説明させてください(そして、おそらく皆さんはすでにこれを知っているでしょう)。

ブラウザーは、特定のホスト名に対して一度に開いている限られた数の同時接続のみを保持します。たとえば、IE6 は www.foo.net と言うために 6 つの接続しか行いません。

たとえば images.foo.net から画像を呼び出すと、すぐに 6 つの新しい接続が得られます。アイデアは、さまざまなコンテンツ タイプをさまざまなホスト名 (css.foo.net、scripts.foo.net、ajaxcalls.foo.net) に分離して、ブラウザーが実際にユーザーに代わって動作していることを確認することです。

于 2009-11-18T02:18:11.650 に答える