我目前在托管的虚拟服务器上,我想为我的 Asp.Net 3.5 站点启用 GZip 压缩,我该如何开始?
我曾尝试使用“打包”的 JS 文件,但它们不起作用,我假设这是因为它们没有被正确处理......?
我目前在托管的虚拟服务器上,我想为我的 Asp.Net 3.5 站点启用 GZip 压缩,我该如何开始?
我曾尝试使用“打包”的 JS 文件,但它们不起作用,我假设这是因为它们没有被正确处理......?
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 的总大小。
我首选的方法是使用像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 文件。
我认为 IIS 是配置它的地方。如果您不能直接更改 IIS,您可以将处理程序添加到检查 Accept-Encoding: gzip 或 deflate 设置的所有请求。然后你使用SharpZipLib之类的东西进行正确的压缩。然而,这很快就会变得笨拙。
您会发现手动 gzip 压缩静态文件(如 css 或 js)的成功有限。假设您在 html 中包含styles.css.gz
和scripts.js.gz
,并且您将 gz 扩展名映射到 gzip 压缩文本的 mimetype(是application/x-gzip
吗?)很多浏览器(即 firefox、safari,也许是 chrome)都可以很好地处理它。但是有些浏览器不会,而且您将它们排除在外(链接,也许是旧歌剧)。
我一直在使用一个方便的小型服务器控件来进行 CSS 缩小,称为 StyleManager。它在引擎盖下使用 YUI Compressor。
添加到您的站点比手动添加 YUI C 更容易,而且它的用法很像 asp.net 的 ScriptManager,所以很快就习惯了。
最重要的是——它也结合了你的 CSS 文件。因此,与其下载 10 个 CSS 文件,不如将其下载为 1 个,这些文件也将被压缩等。
看看 - gStyleManager.com
我会考虑使用“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>
您还可以使用代码对脚本进行 GZip。它的工作方式是使用 ASP.NET 页面来传递压缩文件以及正确的标题(告诉浏览器该流已压缩)。我写了一篇文章如何利用 GZip 压缩以及缩小(使用 YUI)和捆绑脚本(减少到服务器的往返次数),您可以在http://www.codeproject.com/KB/custom找到它-controls/smartinclude.aspx
上一篇文章适用于 aspx 页面,但不适用于 css 和 js 文件。在压缩中包含css
和文件的技巧是:js
.css
将您的和.js
文件的文件扩展名更改为.css.aspx
和.js.aspx
<%@ Page ContentType="text/css" %>
和<%@ Page ContentType="text/javascript" %>
.css.aspx
.js.aspx
.css.aspx
and.js.aspx
文件而不是.css
and文件.js