0

私は aspx ページを持っていますが、すべてのコンテンツは手で生成されています (はい、ハンドラーを作成する必要があることはわかっています。別の質問があります)

出力をクライアント ブラウザにキャッシュしたい。問題は、1 つのクエリに対してのみキャッシュされることです。

        public static void ProceedCaching(string etag, string lastModify, string response, HttpResponse Response,
                                      HttpRequest Request)
    {
        Response.AddHeader("ETag", "\"" + etag + "\"");
        Response.AddHeader("Last-Modified", lastModify);
        Response.AppendHeader("Cache-Control", "Public");
        Response.AppendHeader("Expires",
                              DateTime.Now.AddMinutes(1).ToUniversalTime().ToString("r",DateTimeFormatInfo.InvariantInfo));

        string ifModified = Request.Headers["If-Modified-Since"];

        if (!string.IsNullOrEmpty(ifModified))
        {
            if (ifModified.Contains(";"))
                ifModified = ifModified.Remove(ifModified.IndexOf(';'));
        }

        string incomingEtag = Request.Headers["If-None-Match"];

        if (String.Compare(incomingEtag, etag) == 0 || string.Compare(ifModified, lastModify) == 0)
        {
            Response.StatusCode = 304;
            Response.End();
        }

        Response.Write(response);
        Response.End();
    }

それはかなり面倒になっています。私が言ったように、一度だけキャッシュされます。受信後、HTTP 304 ブラウザーは情報 (etag、lastmodified) をキャッシュせずにクリーン リクエストを送信します。アイデアはありますか?

4

2 に答える 2

0

ここでこの答えを見つけました

一般的に、これらは従う最も一般的なルールです(詳細を理解していなくても心配しないでください。以下で説明します)。

  1. 応答のヘッダーがキャッシュにそれを保持しないように指示する場合、それは保持されません。
  2. リクエストが認証されているか安全である場合、リクエストはキャッシュされません。
  3. 応答にバリデーター(ETagまたはLast-Modifiedヘッダー)が存在せず、明示的な鮮度情報がない場合、キャッシュ不可と見なされます。
  4. キャッシュされた表現は、次の場合に新しいと見なされます(つまり、オリジンサーバーに確認せずにクライアントに送信できます)。
    • 有効期限またはその他の年齢管理ヘッダーが設定されており、まだ新しい期間内にあります。
    • ブラウザのキャッシュがすでに表現を確認していて、セッションを1回チェックするように設定されている場合。
    • プロキシキャッシュが最近表現を確認し、比較的ずっと前に変更された場合。新鮮な表現は、オリジンサーバーに確認せずに、キャッシュから直接提供されます。
  5. 表現が古くなっている場合、オリジンサーバーはそれを検証するか、キャッシュにあるコピーがまだ良好かどうかをキャッシュに通知するように求められます。

そして、あなたがそれをキャッシュしたくないのであれば、Microsoftは良い記事を持っています。

于 2008-12-17T03:31:42.817 に答える
0

最初の行で etag の周りに追加している引用符を削除すると、コードスニペットはうまく機能します。しかし、それはスニペットの単なる間違いであり、あなたが直面している実際の問題ではないと推測しています。

Firefox 3 は、最初の 304 を受信した後、わざわざサーバーにアクセスすることさえしません。IE7 は続行しますが、lastmod/etag ヘッダーを正しく送信し、毎回 304 を受信します。

ブラウザのキャッシュ設定を変更したからではありませんか? 確認のため、別のブラウザで試してみます。

少しきれいにするために、ヘッダーを直接設定する代わりに、Response.Caching のメソッドを使用できます。

于 2008-12-13T10:12:01.690 に答える