2

GET私の応答のいくつかは、ページと返信の両方で、短期間POST実装されます。[OutputCache]

また、次の関数を使用してサイト全体の圧縮を有効にしました。

protected void Application_BeginRequest(object sender, EventArgs e)
{
    // Implement HTTP compression
    var app = (HttpApplication) sender;

    // Retrieve accepted encodings
    var encodings = app.Request.Headers.Get("Accept-Encoding");
    if (encodings == null)
        return;
    encodings = encodings.ToLower();

    if (encodings.Contains("gzip"))
    {
        app.Response.Filter = new GZipStream(app.Response.Filter, CompressionMode.Compress);
        app.Response.AppendHeader("Content-Encoding", "gzip");
    }
    else if (encodings.Contains("deflate"))
    {
        app.Response.Filter = new DeflateStream(app.Response.Filter, CompressionMode.Compress);
        app.Response.AppendHeader("Content-Encoding", "deflate");
    }
}

問題は、キャッシュされたファイルを再圧縮しようとすることです。これは、キャッシュされた応答を送信するたびに、圧縮されてガベージになることを意味します。

app.Response.Headers["Content-Encoding"]既存の圧縮を調べようと考えましたが、PlatformNotSupported例外が発生します。キャッシュされた応答を削除せずに圧縮を有効にするにはどうすればよいですか?

4

1 に答える 1

0

まず、そのロジックを に移動しApplication_PostRequestHandlerExecuteます。これは、ページが実際に実行された場合にのみ実行されます。このような場合、圧縮された出力と Content-Encoding ヘッダーがキャッシュされ、応答として送信されます。後続のキャッシュ ヒットでは、フィルターの割り当てなしで圧縮されたコンテンツとヘッダーが提供されます。

次に、この URL が content-encoding によって異なることをキャッシュに知らせる必要があります。そこに次の行を追加する必要があります (短絡の前に):

app.Response.Cache.SetVaryByCustom("encoding");

override と同様HttpApplication.GetVaryByCustomStringに、次の行に沿って:

protected override GetVaryByCustomString(HttpContext ctx, string custom) {
    if (custom != "encoding") return base.GetVaryByCustomString(ctx, custom);

    var acceptEncodings = ctx.Request.Headers["Accept-Encoding"];
    if (acceptEncodings.Contains("gzip")) return "gzip";
    if (acceptEncodings.Contains("deflate")) return "deflate";
    return "unencoded";
}

最後に、同じヘッダーでキャッシュを変更する必要があることをクライアントに伝える必要があります。Accept-Encoding の場合、ユーザー エージェントがこれを変更する可能性は低いですが、それは正しいことです。悲しいかな、一部のブラウザーはとにかくこれを無視します。

app.Response.Cache.VaryByHeaders["Accept-Encoding"] = true;
于 2012-09-08T02:36:27.427 に答える