gpt4 book ai didi

asp.net-mvc - gzip 压缩不起作用并且无法在 chrome 中获取 304

转载 作者:行者123 更新时间:2023-12-01 22:50:50 25 4
gpt4 key购买 nike

我正在我的 asp.net mvc 5 应用程序中开发压缩和缓存机制。

我正在发送具有以下缓存 header 的文件:

            Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetExpires(DateTime.UtcNow.AddYears(1).ToUniversalTime());
Response.Cache.SetLastModified(System.IO.File.GetLastWriteTime(serverPath).ToUniversalTime());
Response.AppendHeader("Vary", "Accept-Encoding");

IE11、Edge、Firefox 都会在 F5 刷新时发送 If-Modified-Since header ,但 Chrome 不会。为什么会这样以及如何解决它?在 Chrome 中,我收到 200 状态代码,并且文件是从缓存加载的。

我遇到的第二个问题是启用 gzip 压缩。我有一个标准的 Action 过滤器:

public class CompressContentMvcAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
GZipEncodePage();
}

private bool IsGZipSupported()
{
string AcceptEncoding = HttpContext.Current.Request.Headers["Accept-Encoding"];

if (!string.IsNullOrEmpty(AcceptEncoding) &&
(AcceptEncoding.Contains("gzip") || AcceptEncoding.Contains("deflate")))
{
return true;
}

return false;
}

private void GZipEncodePage()
{
HttpResponse Response = HttpContext.Current.Response;

if (IsGZipSupported())
{
string AcceptEncoding = HttpContext.Current.Request.Headers["Accept-Encoding"];

if (AcceptEncoding.Contains("gzip"))
{
Response.Filter = //new GZipCompressionService().CreateCompressionStream(Response.Filter);
new System.IO.Compression.GZipStream(Response.Filter,
System.IO.Compression.CompressionMode.Compress);
Response.Headers.Remove("Content-Encoding");
Response.AppendHeader("Content-Encoding", "gzip");
}
else
{
Response.Filter =// new DeflateCompressionService().CreateCompressionStream(Response.Filter);
new System.IO.Compression.DeflateStream(Response.Filter,
System.IO.Compression.CompressionMode.Compress);
Response.Headers.Remove("Content-Encoding");
Response.AppendHeader("Content-Encoding", "deflate");
}
}

// Allow proxy servers to cache encoded and unencoded versions separately
Response.AppendHeader("Vary", "Content-Encoding");
}
}

我在返回应用程序 Assets 的操作方法上应用了此过滤器,但它得到了传输编码:对每个文件进行分块,而不是进行 gzip 压缩。该过滤器是从我之前的项目复制而来的,并且预计它仍然可以正常工作。难道是IIS服务器的问题?在本地,我有 IIS 10 和 .NET 4.7,这是较旧的应用程序,它的工作托管在 IIS 8.5 和框架 4.5 上。想不出其他什么了。第二天我在谷歌上搜索,找不到任何线索。我对 IIS 中的压缩不感兴趣。

[编辑]

我从响应中得到的标题:

 HTTP/1.1 200 OK
Cache-Control: public
Content-Type: text/javascript
Expires: Sat, 18 May 2019 08:58:48 GMT
Last-Modified: Thu, 10 May 2018 13:26:02 GMT
Vary: Content-Encoding
Server: Microsoft-IIS/10.0
X-AspNetMvc-Version: 5.2
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Fri, 18 May 2018 08:58:48 GMT
Transfer-Encoding: chunked

最佳答案

我总是使用 Fiddler 来检查此类挑战。

F5/If-Modified-Since 问题。

如果已设置过期 header 并且其日期时间值仍然是实际值,Chrome 就不会发出新请求。因此 Chrome 尊重您预期的缓存行为。当通过其他浏览器浏览您的网站时,您会发现这些浏览器也不会发送对这些 Assets 的任何请求。 F5很“特殊”,它是强制刷新。

分块/gzip 问题

清除浏览器缓存并检查第一个响应。 Fiddler 将显示“响应正文已编码”,这意味着已压缩(gzip 或 deflate)。

您是否看到 Transfer-Encoding 分块取决于 Content-Length header 是否存在。请参阅下面的回复中的差异。如果您不希望分块的传输编码设置内容长度 header 。

Content-Type: text/javascript; charset=utf-8
Content-Encoding: gzip
Expires: Sat, 25 May 2019 13:14:11 GMT
Last-Modified: Fri, 25 May 2018 13:14:11 GMT
Vary: Accept-Encoding
Server: Microsoft-IIS/10.0
Content-Length: 5292

Content-Type: text/javascript; charset=utf-8
Transfer-Encoding: chunked
Content-Encoding: gzip
Expires: Sat, 25 May 2019 13:14:11 GMT
Last-Modified: Fri, 25 May 2018 13:14:11 GMT
Vary: Accept-Encoding
Server: Microsoft-IIS/10.0

因为您是通过自己的代码而不是通过 IIS 静态文件模块来处理 Assets 服务,所以您必须自己处理所有响应 header 。

关于asp.net-mvc - gzip 压缩不起作用并且无法在 chrome 中获取 304,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50386659/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com