我目前使用托管的虚拟服务器,我想为我的 Asp.Net 3.5 网站启用 GZip 压缩,应该如何开始?
我已经尝试使用"packed" JS 文件,但它们没有起作用,我认为这是因为它们没有被正确处理...?
我目前使用托管的虚拟服务器,我想为我的 Asp.Net 3.5 网站启用 GZip 压缩,应该如何开始?
我已经尝试使用"packed" JS 文件,但它们没有起作用,我认为这是因为它们没有被正确处理...?
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的总大小。
我的首选方法是使用压缩工具,比如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.
}
我一直在使用一个很方便的服务器控件来进行CSS文件的压缩,它叫做StyleManager。它在底层使用了YUI Compressor。
相比手动添加YUI C,它更容易添加到你的网站上,使用方式也很像asp.net的ScriptManager,所以很快就能上手。
最重要的是-它还可以将你的CSS文件合并成一个文件。所以不用下载10个CSS文件,只需要下载1个即可,而且还可以进行压缩等操作。
快去看看吧- gStyleManager.com
我同意IIS是配置这个的地方。如果你不能直接更改IIS,你可以添加一个处理程序来检查所有请求的Accept-Encoding: gzip或deflate设置。然后你可以使用类似SharpZipLib的东西进行正确的压缩。但是这很快就会变得笨拙。
你可以手动压缩一些静态文件,比如css或js,会有一些有限的成功。比如在你的html中包含styles.css.gz
和scripts.js.gz
,并将gz扩展名映射到gzipped文本的mimetype(是application/x-gzip
吗?),很多浏览器(ie、firefox、safari、可能chrome)都可以很好地处理它。但是有些浏览器不行,你需要考虑它们(链接,可能是旧版opera)。
我建议使用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>
前面的帖子对于aspx页面很有效,但对于css和js文件则不行。将css
和js
文件包含在压缩中的技巧是:
.css
和.js
文件的扩展名更改为.css.aspx
和.js.aspx
.css.aspx
和.js.aspx
文件中插入<%@ Page ContentType="text/css" %>
和<%@ Page ContentType="text/javascript" %>
.css.aspx
和.js.aspx
文件,而不是.css
和.js
文件