我正在尝试为我的asp.net页面实现GZip压缩(包括我的CSS和JS文件).我尝试了以下代码,但它只压缩我的.aspx页面(从YSlow中找到它)
HttpContext context = HttpContext.Current; context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress); HttpContext.Current.Response.AppendHeader("Content-encoding", "gzip"); HttpContext.Current.Response.Cache.VaryByHeaders["Accept-encoding"] = true;
上面的代码只压缩我的.aspx页面代码(标记)而不是CSS和JS文件,它们作为外部文件包含在内.请告诉我如何使用代码在ASP.NET中实现GZip压缩(因为我在共享主机服务器上,我无法访问IIS服务器配置).而且在上面的代码中,我没有得到最后两行,为什么使用它们以及这些行的目的是什么.请解释!
谢谢
这是css和javascript文件的解决方案
信用:如何在ASP.NET和GoDaddy上进行GZip
对于压缩JS和CSS文件,您实际上必须在IIS级别处理它,因为这些文件是在没有ASP.NET运行时的情况下直接呈现的.
你可以在IIS中创建一个JSX和CSSX扩展映射到aspnet_isapi.dll,然后利用你的邮政编码,但IIS可能会为你做得更好.
内容编码标头告诉浏览器它需要在呈现之前解压缩内容.根据内容的形状,有些浏览器足够聪明,无论如何都可以解决这个问题,但最好还是告诉它.
Accept-encoding缓存设置在那里,因此gzip压缩内容的缓存版本将不会发送到仅请求text/html的浏览器.
这可能对你试用它很有用,它接受deflate和gzip压缩.
void Application_PreRequestHandlerExecute(object sender, EventArgs e) { HttpApplication app = sender as HttpApplication; string acceptEncoding = app.Request.Headers["Accept-Encoding"]; Stream prevUncompressedStream = app.Response.Filter; if (app.Context.CurrentHandler == null) return; if (!(app.Context.CurrentHandler is System.Web.UI.Page || app.Context.CurrentHandler.GetType().Name == "SyncSessionlessHandler") || app.Request["HTTP_X_MICROSOFTAJAX"] != null) return; if (acceptEncoding == null || acceptEncoding.Length == 0) return; acceptEncoding = acceptEncoding.ToLower(); if (acceptEncoding.Contains("deflate") || acceptEncoding == "*") { // deflate app.Response.Filter = new DeflateStream(prevUncompressedStream, CompressionMode.Compress); app.Response.AppendHeader("Content-Encoding", "deflate"); } else if (acceptEncoding.Contains("gzip")) { // gzip app.Response.Filter = new GZipStream(prevUncompressedStream, CompressionMode.Compress); app.Response.AppendHeader("Content-Encoding", "gzip"); } }
它只压缩你的ASPX文件的原因是你编写的代码只嵌入在ASPX文件中.ASPX文件是来自其包含的任何链接内容的单独请求.因此,如果您有一个包含以下内容的ASPX页面:
这相当于从浏览器到资源的2个请求(除了DNS查询):
对于aspx页面和
对于aspx页面包含的图像.
每个请求都有自己的响应流.您发布的代码仅附加到ASPX响应流,这就是为什么只压缩您的ASPX页面.您发布的代码的第1行和第2行基本上接管了页面的正常响应流,并注入了一些"中间人"代码,在这种情况下,使用GZip流来处理和压缩正常输出流,然后将其发送到网络中.
第3和第4行正在设置响应标头.所有http请求和响应都具有在内容之前发送的标头.这些设置请求/响应,以便服务器和客户端知道发送的内容和方式.
在这种情况下,第3行通知客户端浏览器响应流是通过gzip压缩的,因此需要在显示之前由客户端浏览器解压缩.
第4行只是打开响应的Accept-Encoding标头.否则,这将不会出现在答复中.
您可以编写/获取可插入的模块,允许您压缩其他MIME类型的多个部分,例如*.js和*.css,但最好只使用IIS的内置压缩功能.
您还没有说过您正在使用的IIS版本,但如果它是IIS 7.0,则需要在
web.config文件的部分中包含以下内容:
..
理查德