6

ASP.NETを使用してコードでExpiresヘッダーをプログラムで設定する方法はありますか?具体的には、フォルダー全体とすべてのサブフォルダーに設定する必要があります。フォルダーには静的ファイル(JavaScript、CSS、画像など)のみが含まれ、aspxファイルは含まれないため、aspxコードにコードを追加することはできません。 -page_loadの背後。

通常、これはIISで直接設定できます。ただし、サーバーはクライアントによってロックダウンされており(展開用のWebアプリディレクトリへのFTPアクセスしかありません)、クライアントにIISでExpiresヘッダーを設定させるには氷の時代がかかります(これは公共部門/政府のサイトです)。

Yahooの推奨事項http://developer.yahoo.com/performance/rules.html#expiresに従って、フロントエンドの最適化の理由でこれを行っています。

更新: HttpModuleを作成してみました...

public class FarFutureExpiresModule : IHttpModule
{
    public void Dispose() { }

    public void Init(HttpApplication context)
    {
        context.BeginRequest += new EventHandler(context_BeginRequest);
    }

    void context_BeginRequest(object sender, EventArgs e)
    {
        HttpContext context = HttpContext.Current;

        string url = context.Request.Url.ToString();

        if (url.Contains("/StaticContent/"))
        {
            context.Response.Cache.SetExpires(DateTime.Now.AddYears(30));
        }
    }
}

これはうまくいかないようですが。コードにブレークポイントを設定しましたが、正しく実行されているように見えます。ただし、Firefoxで生のHTTPヘッダー情報を分析すると、expires値が設定されていません。BeginRequestを使用していることに注意してください。ただし、PostReleaseRequestStateとPreSendRequestHeadersにもフックしようとしましたが、どちらも機能していないようです。何か案は?

アップデート2:わかりました。IIS6を実行しているため、HttpModulesは静的ファイルでは実行されず、動的ファイル(* .aspxなど)でのみ実行されます。RickNZの助けのおかげで、私は次のIHttpModuleを思いついた。

public class FarFutureExpiresModule : IHttpModule
{
    public void Dispose() { }

    public void Init(HttpApplication context)
    {
        context.BeginRequest += new EventHandler(context_BeginRequest);
    }

    void context_BeginRequest(object sender, EventArgs e)
    {
        HttpContext context = HttpContext.Current;

        string url = context.Request.Url.ToString();

        if (url.Contains("/StaticContent/"))
        {
            context.Response.Cache.SetExpires(DateTime.Now.AddYears(30));
            context.Response.Cache.SetMaxAge(TimeSpan.FromDays(365.0 * 3.0));
        }
    }
}

...動作しているように見えますが、Visual Studioの組み込みWebサーバーとIIS7(統合パイプラインモードの場合)でのみ機能します。同僚は、静的ファイルでHttpModulesを機能させるためにIIS6でワイルドカードマッピングを設定することについて言及しましたが、IIS6にアクセスできる場合は、Far-Future Expiresヘッダーを直接設定するだけで、このHttpModuleを気にする必要はありません。しかたがない!

4

3 に答える 3

3

IIS 7を使用している場合、最も簡単な方法は、統合モードで静的ファイルに対して実行されるHttpModuleを作成し、そこからExpiresヘッダーとCache-Controlヘッダーを設定することです。

アップデート:

HttpModuleは機能するはずですが、私は通常、次のようにも呼び出します。

context.Response.Cache.SetMaxAge(TimeSpan.FromDays(365.));

アップデート2:

IIS 6では、プログラムでメタベースを変更する必要があります。昇格された権限が必要ですが、可能です。

他の唯一のオプションは、C++でISAPIモジュールを作成することです。

于 2009-12-18T11:53:28.503 に答える
1

YSLOWが推奨を行ったとしても、Atwood氏の記事「YSlow:Yahooの問題はあなたの問題ではない」を読むことでメリットが得られるかもしれません。

記事から:

Expiresヘッダーを追加します(重み:11)

これ自体は悪いアドバイスではありませんが、間違えると大きな問題を引き起こす可能性があります。たとえば、MicrosoftのIISでは、おそらくまさにその理由で、Expiresヘッダーはデフォルトで常にオフになっています。HTTPリソースにExpiresヘッダーを設定することで、少なくともExpiresヘッダーの有効期限までは、そのリソースの新しいバージョンをチェックしないようにクライアントに指示します。私が決して言わないとき、私はそれを意味します-ブラウザは新しいバージョンを要求することさえしません。クライアントがキャッシュをクリアするか、キャッシュが有効期限に達するまで、キャッシュされたバージョンが適切であると想定します。Yahooは、これらのリソースを更新する必要があるときに、これらのリソースのファイル名を変更すると述べています。

したがって、要点の1つは、マスターcssファイルの内容を変更したが、cssファイルの名前も変更しないことです。Yahooの推奨事項を採用した場合、エンドユーザーは、ヘッダーの有効期限が切れるまで、編集したファイルの更新バージョンを取得できません。あなたはそのようなシナリオに満足していますか?

于 2011-08-01T19:07:50.173 に答える
0

パフォーマンスを向上させる良い方法には、応答のgzip圧縮(IIS6では最も簡単ではありません)、静的ファイル(css、js)の縮小、静的ファイルのマージ(1つの大きなcss、1つの大きなjs)、スプライトの使用などがあります。アイデアは、HTTPリクエストの総数を減らしてから、レスポンスのサイズを減らすことです。

于 2009-12-18T12:40:43.170 に答える