如何在ASP.NET中实现GZip压缩?

我想实现我的asp.net页面(包括我的CSS和JS文件)的GZip压缩。 我尝试了下面的代码,但它只压缩我的.aspx页面(从YSlowfind它)

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; 

上面的代码只是压缩我的.aspx页面代码(标记)而不是作为外部文件包含的CSS和JS文件。 请告诉我如何在ASP.NET中使用代码实现GZip压缩(因为我在共享主机服务器上,无法访问IIS服务器configuration)。 而且在上面的代码中,我没有得到最后两行,为什么使用它们,以及这些行的目的是什么。 请解释!

谢谢

为了压缩JS和CSS文件,你实际上必须在IIS级别处理这些文件,因为这些文件是直接在没有ASP.NET运行时的情况下渲染的。

您可以在IIS中将JSX和CSSX扩展映射到aspnet_isapi.dll,然后利用您的邮政编码,但IIS可能会为您做得更好。

内容编docker告诉浏览器在渲染之前需要解压缩内容。 根据内容的形状,某些浏览器无论如何都足够聪明,无论如何,只要告诉它就更好。

接受编码caching设置在那里,以便压缩内容的caching版本不会被发送到只请求text / html的浏览器。

这是解决scheme的CSS和JavaScript文件

 <httpCompression> <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/> <dynamicTypes> <add mimeType="text/*" enabled="true"/> <add mimeType="message/*" enabled="true"/> <add mimeType="application/javascript" enabled="true"/> <add mimeType="*/*" enabled="false"/> </dynamicTypes> <staticTypes> <add mimeType="text/*" enabled="true"/> <add mimeType="message/*" enabled="true"/> <add mimeType="application/javascript" enabled="true"/> <add mimeType="*/*" enabled="false"/> </staticTypes> </httpCompression> <urlCompression doStaticCompression="true" doDynamicCompression="true"/> </system.webServer> 

信用: 如何GZip在ASP.NET和GoDaddy

它只是压缩你的ASPX文件的原因是你写的代码只是embedded在ASPX文件中。 ASPX文件是它包含的任何链接内容的单独请求。 所以如果你有一个ASPX页面包含:

 <img src="www.example.com\exampleimg.jpg" alt="example" /> 

这相当于从浏览器到资源的2个请求(抛开DNS查找):

  1. 为aspx页面和
  2. 为aspx页面包含的图像。

每个请求都有自己的响应stream。 您发布的代码仅附加到ASPX响应stream,这就是为什么只有您的ASPX页面被压缩。 您发布的代码的第1行和第2行基本上是接pipe页面的正常响应stream,并注入一些“中间人”代码,在这种情况下,使用GZipstream进行正常输出stream的压缩和压缩,然后将其发送到电线上。

第3和第4行正在设置响应头。 所有http请求和响应都有在内容之前发送的标题。 这些设置请求/响应,以便服务器和客户端知道什么是发送和如何。

在这种情况下,第3行通知客户端浏览器响应stream是通过gzip压缩的,因此需要在显示之前由客户端浏览器解压缩。

而第4行只是打开响应的Accept-Encoding头。 否则,这个答案就不存在了。

有可插拔的模块,你可以编写/获取,允许你压缩其他MIMEtypes的多层如* .js和* .css,但你最好只使用IIS的内置压缩function。

你还没有说你正在使用哪个版本的IIS,但是如果它是IIS 7.0,那么你需要在你的web.config文件的<system.webserver>部分包含如下内容:

 <httpCompression> <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" /> <staticTypes> <add mimeType="text/*" enabled="true" /> </staticTypes> </httpCompression> <urlCompression doStaticCompression="true" /> 

..

理查德

这可能是有用的,你试试看,这接受deflate和gzip压缩。

  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 == null) return; if (!(app.Context.CurrentHandler is System.Web.UI.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 == "*") { // deflate 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"); } } 

在IIS7中,所有请求都转到.net,所以你将不得不创build一个HttpModule,将这些头文件添加到所有响应中。

没有IIS7和共享主机,你将不得不创build一个处理程序映射.net文件扩展名,你不使用(如.asmx),并在web.config中指定.asmx文件转到您设置的HttpHandler将path改写为.jpg或其他,并在那里设置标题。

回答你最后的问题。 这两行设置发回给浏览器的响应的HTTP头。 Content-Encoding告诉浏览器,响应编码为gzip,需要解码。 最后一行将Accept-Encoding添加到Vary标题 。 有了这个,浏览器或代理可以确定响应是否是唯一的,或者受某些其他头文件的影响,并调整caching。

将.aspx扩展名添加到.css或.js文件。 在文件中使用<%@ Page ContentType =“text / css”%>或javascript来为它提供正确的MIMEtypes。 使用URL重写来隐藏用户代理浏览器。 内容编码响应头附加gzip表示gzip是用来执行压缩的方法。 不同的响应头被设置为Accept-Encoding,所以所有的caching都知道应该提供哪个页面(压缩或者非压缩)取决于请求的Accept-Encoding头。 我在https://stackoverflow.com/a/14509007/1624169上详细阐述了这一点;