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 因内容编码而异。您需要在其中添加此行(在短路之前):

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";
}

最后,您应该告诉客户端他们需要在同一个标​​头上改变缓存。在接受编码的情况下,用户代理不太可能改变这一点,但这是正确的做法。唉,有些浏览器无论如何都会忽略这一点。

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