C# 激活压缩后.css文件中的奇怪效果
昨天我在我的网站上激活了压缩,如下所示:C# 激活压缩后.css文件中的奇怪效果,c#,asp.net,compression,C#,Asp.net,Compression,昨天我在我的网站上激活了压缩,如下所示: void context_BeginRequest(object sender, EventArgs e) { HttpApplication app = (HttpApplication)sender; string encodings = app.Request.Headers.Get("Accept-Encoding"); if (encodings == null) return; strin
void context_BeginRequest(object sender, EventArgs e)
{
HttpApplication app = (HttpApplication)sender;
string encodings = app.Request.Headers.Get("Accept-Encoding");
if (encodings == null)
return;
string url = app.Request.RawUrl.ToLower();
if (url.Contains(".js") || url.Contains(".aspx") || url.Contains(".css") || url.Contains("ajax.ashx"))
{
Stream baseStream = app.Response.Filter;
encodings = encodings.ToLower();
if (encodings.Contains("gzip"))
{
app.Response.Filter = new GZipStream(baseStream, CompressionMode.Compress);
app.Response.AppendHeader("Content-Encoding", "gzip");
}
else if (encodings.Contains("deflate"))
{
app.Response.Filter = new DeflateStream(baseStream, CompressionMode.Compress);
app.Response.AppendHeader("Content-Encoding", "deflate");
}
}
}
if (url.Contains(".js") || url.Contains(".aspx") || url.Contains(".css") || url.Contains("ajax.ashx"))
{
app.Response.AppendHeader("Vary", "Accept-Encoding");
encodings = encodings.ToLower();
if (encodings.Contains("gzip") || encodings == "*")
{
app.Response.Filter = new GZipStream(baseStream, CompressionMode.Compress);
app.Response.AppendHeader("Content-Encoding", "gzip");
}
else if (encodings.Contains("deflate"))
{
app.Response.Filter = new DeflateStream(baseStream, CompressionMode.Compress);
app.Response.AppendHeader("Content-Encoding", "deflate");
}
}
昨晚,人们抱怨网站的风格被破坏了。我在Firefox和Chrome中尝试了这个网站,但也遇到了同样的问题,直到我强制刷新,清除了缓存
今天早上,我打开Safari,查看它在浏览器中的外观,并检查存储的样式表。下面是顶行的一部分:
���`I�%&/m�{J�J��t��`$ؐ@�������iG#)�*��eVe]f@�흼��{����{����;�N'���?\fdl��J�ɞ!���?~|?"�~+M�m�?��{�7y����l]�餮���N���̛�x�Ϋ�Q�cMVg��
我认为要么Safari试图解压一开始没有被压缩的东西,要么它收到了一个压缩文件而没有解码
这是一个一次性问题,当访问我的网站的访问者清除他们的缓存时就会被清除,还是我在编写HttpCompression函数时出错了?请尝试以下方法:
HttpApplication app = sender as HttpApplication;
string acceptEncoding = app.Request.Headers["Accept-Encoding"];
Stream prevUncompressedStream = app.Response.Filter;
if (!(app.Context.CurrentHandler is Page ||
app.Context.CurrentHandler.GetType().Name == "SyncSessionlessHandler") ||
app.Request["HTTP_X_MICROSOFTAJAX"] != null)
return;
if (string.IsNullOrEmpty(acceptEncoding))
return;
acceptEncoding = acceptEncoding.ToLower();
if (acceptEncoding.Contains("gzip") || acceptEncoding == "*")
{
// gzip
app.Response.Filter = new GZipStream(prevUncompressedStream, CompressionMode.Compress);
app.Response.AppendHeader("Content-Encoding", "gzip");
}
else if (acceptEncoding.Contains("deflate"))
{
// defalte
app.Response.Filter = new DeflateStream(prevUncompressedStream, CompressionMode.Compress);
app.Response.AppendHeader("Content-Encoding", "deflate");
}
我相信我这里的问题与我的回答中没有添加
Vary:Accept Encoding
标题有关。请看。我的代码现在如下所示:
void context_BeginRequest(object sender, EventArgs e)
{
HttpApplication app = (HttpApplication)sender;
string encodings = app.Request.Headers.Get("Accept-Encoding");
if (encodings == null)
return;
string url = app.Request.RawUrl.ToLower();
if (url.Contains(".js") || url.Contains(".aspx") || url.Contains(".css") || url.Contains("ajax.ashx"))
{
Stream baseStream = app.Response.Filter;
encodings = encodings.ToLower();
if (encodings.Contains("gzip"))
{
app.Response.Filter = new GZipStream(baseStream, CompressionMode.Compress);
app.Response.AppendHeader("Content-Encoding", "gzip");
}
else if (encodings.Contains("deflate"))
{
app.Response.Filter = new DeflateStream(baseStream, CompressionMode.Compress);
app.Response.AppendHeader("Content-Encoding", "deflate");
}
}
}
if (url.Contains(".js") || url.Contains(".aspx") || url.Contains(".css") || url.Contains("ajax.ashx"))
{
app.Response.AppendHeader("Vary", "Accept-Encoding");
encodings = encodings.ToLower();
if (encodings.Contains("gzip") || encodings == "*")
{
app.Response.Filter = new GZipStream(baseStream, CompressionMode.Compress);
app.Response.AppendHeader("Content-Encoding", "gzip");
}
else if (encodings.Contains("deflate"))
{
app.Response.Filter = new DeflateStream(baseStream, CompressionMode.Compress);
app.Response.AppendHeader("Content-Encoding", "deflate");
}
}
你有什么理由不让我告诉你吗?@Mr.defessional在我之前开发这个网站的家伙就是这样做的(他只为对ajax.ashx的响应启用了压缩)。看起来还可以。谢谢你。如果(!app.Context.CurrentHandler是Page | |…语句,那么
会检查什么?我对压缩没有意义的东西(如图像)非常谨慎。例如,我从userImage.ashx
文件提供一些动态PNG。