12

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

我曾尝试使用“打包”的 JS 文件,但它们不起作用,我假设这是因为它们没有被正确处理......?

4

7 回答 7

21

GZIP 应该由 IIS 处理,你运行的是什么版本的 IIS?

客户端负责向服务器请求 GZiped 版本。服务器会找两个东西,请求是http 1.1,一个是Accept-Encoding: gzip的header。查找这些标头的一种简单方法是使用firebug

IIS6 - 可以使用 iis 管理单元启用 GZip。Microsoft 的 MSDN 主题关于 Gzip 和 IIS6

IIS7 - GZip 可以通过 web.config 使用 httpCompression xml 标签启用Nick Berardi 的 Getting IIS 7 to Compress JavaScript

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

于 2009-03-21T05:27:56.920 回答
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 文件。

于 2009-03-21T05:57:56.660 回答
1

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

您会发现手动 gzip 压缩静态文件(如 css 或 js)的成功有限。假设您在 html 中包含styles.css.gzscripts.js.gz,并且您将 gz 扩展名映射到 gzip 压缩文本的 mimetype(是application/x-gzip吗?)很多浏览器(即 firefox、safari,也许是 chrome)都可以很好地处理它。但是有些浏览器不会,而且您将它们排除在外(链接,也许是旧歌剧)。

于 2009-03-21T05:50:51.797 回答
1

我一直在使用一个方便的小型服务器控件来进行 CSS 缩小,称为 StyleManager。它在引擎盖下使用 YUI Compressor。

添加到您的站点比手动添加 YUI C 更容易,而且它的用法很像 asp.net 的 ScriptManager,所以很快就习惯了。

最重要的是——它也结合了你的 CSS 文件。因此,与其下载 10 个 CSS 文件,不如将其下载为 1 个,这些文件也将被压缩等。

看看 - gStyleManager.com

于 2011-01-16T15:13:21.567 回答
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>
于 2012-02-18T09:24:33.907 回答
1

您还可以使用代码对脚本进行 GZip。它的工作方式是使用 ASP.NET 页面来传递压缩文件以及正确的标题(告诉浏览器该流已压缩)。我写了一篇文章如何利用 GZip 压缩以及缩小(使用 YUI)和捆绑脚本(减少到服务器的往返次数),您可以在http://www.codeproject.com/KB/custom找到它-controls/smartinclude.aspx

于 2010-09-01T13:41:00.160 回答
0

上一篇文章适用于 aspx 页面,但不适用于 css 和 js 文件。在压缩中包含css和文件的技巧是:js

  1. .css将您的和.js文件的文件扩展名更改为.css.aspx.js.aspx
  2. 在和文件中插入<%@ Page ContentType="text/css" %><%@ Page ContentType="text/javascript" %>.css.aspx.js.aspx
  3. 在页面中包含.css.aspxand.js.aspx文件而不是.cssand文件.js
于 2012-03-03T05:26:08.203 回答