我正在尝试在我们的工作内联网上的网站上启用gzip压缩。不幸的是,我无权访问IIS,因此我所做的任何更改都是通过web.config。
服务器正在运行IIS 6和.NET 2.0。
我通过添加httpmodule
启用了压缩public class EnableCompression : IHttpModule
{
public void Init(HttpApplication application)
{
application.BeginRequest +=
(new EventHandler(this.Application_BeginRequest));
}
private void Application_BeginRequest(Object source, EventArgs e)
{
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;
}
}
我在web.config中注册了
<system.web>
<httpModules>
<add name="EnableCompression" type="EnableCompression"/>
</httpModules>
</system.web>
嗯,以上工作正常,但javascript和css文件不会被压缩。根据我的发现,我必须将.js和.css添加到IIS 6中的应用程序映射中,但当然我不能这样做。
显然这可以通过web.config文件完成,但我不知道该怎么做。
如何为.js和.css文件启用压缩?
答案 0 :(得分:1)
在IIS6中,托管HttpModules
不处理静态代码;它需要一个原生的ISAPI。
您可以使用的一个技巧是将* .js和* .css文件转换为动态文件。您可以将它们更改为* .aspx,并将ContentType设置为正确的MIME类型。例如:
this.Response.ContentType = "application/x-javascript";
唯一的另一个技巧是在标记文件的Page指令中设置StyleSheetTheme=""
。否则,运行时将坚持文档中的<head>
部分。您可以启用输出缓存以最小化性能影响。
我在JS方面撰写了一篇关于此内容的博客文章,如果它有帮助(CSS类似,只是使用不同的MIME类型):http://www.12titans.net/p/dynamic-javascript.aspx
不幸的是,这需要在您的应用中更改JS和CSS文件的名称,但如果您想要压缩并且无法访问IIS,我认为没有办法解决这个问题。
如果要保留* .js和* .css扩展名,可以通过在web.config中为它们添加处理程序来实现。例如:
<compilation>
<buildProviders>
<add extension=".css" type="System.Web.Compilation.PageBuildProvider"/>
</buildProviders>
</compilation>
<httpHandlers>
<add path="*.css" verb="*" type="System.Web.UI.PageHandlerFactory"
validate="true"/>
</httpHandlers>
这从命名角度来看有所帮助,但不是性能;这些文件仍然是动态的 - 它们基本上是* .aspx文件,但具有不同的扩展名。它也无法与ASP.NET主题一起正常工作,因为Themes文件夹中的页面不能是动态的,无论它们的扩展名如何。
答案 1 :(得分:0)
添加到@ RickNZ的答案:
小心转换为动态。 IIS在提供静态文件方面要比动态(内核模式)快得多。只考虑您的应用是否受到带宽问题的支配。
另一个选择是查看CDN的静态内容(内容传送网络)。 Azure,亚马逊,Akamai和其他公司提供服务。这是一种非常快速的地理位置友好的服务静态文件的方式。