ASP.NET 中的 CSS/JS GZip 压缩

12

我目前使用托管的虚拟服务器,我想为我的 Asp.Net 3.5 网站启用 GZip 压缩,应该如何开始?

我已经尝试使用"packed" JS 文件,但它们没有起作用,我认为这是因为它们没有被正确处理...?

7个回答

21

IIS应该处理GZIP压缩,请问您使用的是哪个版本的IIS?

客户端负责向服务器请求GZiped版本。服务器将查找两件事情:请求是http 1.1,头部有Accept-Encoding: gzip。查找这些标头的简单方法是使用Firebug

IIS6 - 可以使用iis snap-in启用GZip。 Microsoft MSDN有关使用IIS6进行Gzip的主题

IIS7 - 可以使用httpCompression xml标记在web.config中启用GZip Nick Berardi's帮助IIS 7压缩JavaScript

通过最小化和打包JavaScript文件,您可以通过删除空格和缩短变量名称来减少JavaScript的总大小。


IIS6的完美演示:http://engineering.leads360.com/post/9301650692/http-compression-gzip-on-iis-6 - Bill Paetzke

7

我的首选方法是使用压缩工具,比如YUI Compressor并将其作为构建过程的一部分(在最小化后,压缩比例不会那么高,或者你可以同时使用两种方式。重点是不能忽视下面所述的更大的性能问题)。

IIS 压缩的主要问题之一是它没有将所有 JS/CSS 文件打包成单个文件。因此,如果您的站点有 7 个 JS 文件和 20 个 CSS 文件(令人惊讶的是这非常普遍),需要进行 27 次 HTTP 往返才能获取数据。为此,编写一个 HTTP 处理程序对于共享托管的人来说是个好主意。

一个简单的构建算法是在 JS/CSS 根目录中拥有一个 make 文件。

If(build.config == release) {
Add your js file in order to the make files.
    e.g. jQuery.js jQuery.form.js  jQuery.container.js custom.js 
Split and pass it as params to YUI
Compress
O/P to site.js 
Delete all the above files.
}

在发布模式下,您的页面主控应该只引用site.js。 编辑: 这里有一个链接,可以获得YUI和nant的集成。 编辑: Justin Etheredge发布了一个名为SquishIt的压缩css/js文件的绝妙工具。

1

我一直在使用一个很方便的服务器控件来进行CSS文件的压缩,它叫做StyleManager。它在底层使用了YUI Compressor。

相比手动添加YUI C,它更容易添加到你的网站上,使用方式也很像asp.net的ScriptManager,所以很快就能上手。

最重要的是-它还可以将你的CSS文件合并成一个文件。所以不用下载10个CSS文件,只需要下载1个即可,而且还可以进行压缩等操作。

快去看看吧- gStyleManager.com


1
你也可以使用代码来进行脚本GZip压缩。它的工作原理是使用ASP.NET页面传递压缩文件以及正确的标头(指示浏览器该流已压缩)。我写了一篇文章介绍如何利用GZip压缩、缩小(使用YUI)和捆绑脚本(减少向服务器的往返次数),你可以在http://www.codeproject.com/KB/custom-controls/smartinclude.aspx找到它。

1

我同意IIS是配置这个的地方。如果你不能直接更改IIS,你可以添加一个处理程序来检查所有请求的Accept-Encoding: gzip或deflate设置。然后你可以使用类似SharpZipLib的东西进行正确的压缩。但是这很快就会变得笨拙。

你可以手动压缩一些静态文件,比如css或js,会有一些有限的成功。比如在你的html中包含styles.css.gzscripts.js.gz,并将gz扩展名映射到gzipped文本的mimetype(是application/x-gzip吗?),很多浏览器(ie、firefox、safari、可能chrome)都可以很好地处理它。但是有些浏览器不行,你需要考虑它们(链接,可能是旧版opera)。


1

我建议使用deflate代替GZip,因为它更高效。我已经添加了两种代码。

如果要将此功能添加到您的网站中,请创建一个文本文件并将以下代码复制粘贴到该文件中,然后将其保存为Global.asax,最后将此文件添加到您的网站根目录中。

<%@ Application Language="C#" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.IO.Compression" %>
<script runat="server">
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 is 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 == "*")
        {
        // defalte
            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");
        }
    }
</script>

0

前面的帖子对于aspx页面很有效,但对于css和js文件则不行。将cssjs文件包含在压缩中的技巧是:

  1. .css.js文件的扩展名更改为.css.aspx.js.aspx
  2. .css.aspx.js.aspx文件中插入<%@ Page ContentType="text/css" %><%@ Page ContentType="text/javascript" %>
  3. 在您的页面中包含.css.aspx.js.aspx文件,而不是.css.js文件

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接