2009-02-16 106 views
72

我想为我的asp.net页面(包括我的CSS和JS文件)实现GZip压缩。我试着下面的代码,但它只是我的压缩.aspx页面中(从YSlow发现)如何在ASP.NET中实现GZip压缩?

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服务器配置)。而且在上面的代码中,我没有得到最后两行,为什么使用它们,以及这些行的目的是什么。请解释!

感谢

回答

26

压缩JS & CSS文件,你实际上必须处理在IIS的水平,因为这些文件直接呈现,而不ASP.NET运行时。

你可以制作一个JSX & IIS中的CSSX扩展映射到aspnet_isapi.dll,然后利用你的邮政编码,但IIS可能会为你做得更好。

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

Accept-encoding缓存设置存在,因此gzip内容的缓存版本将不会发送到仅请求text/html的浏览器。

+4

Hi @Ben,你能告诉我如何使用IIS压缩我的文件,我必须执行的所有设置,虽然我没有访问IIS配置,但我'我会尽力去做。请告诉我如何使用IIS压缩文件?谢谢! – Prashant 2009-02-16 06:15:41

+3

http://stackoverflow.com/a/6992948/8479详细介绍了IIS7或更高版本所需的web.config的简单更改。 – Rory 2013-01-08 14:32:02

2

回答你最后一个问题。这两行为发送回浏览器的响应设置HTTP标头。 Content-Encoding告诉浏览器该响应被编码为gzip并且需要解码。最后一行将Accept-Encoding添加到Vary header。通过这种方式,浏览器或代理可以确定响应是唯一的还是受到某些其他头文件的影响并调整其缓存。

3

在IIS7中,所有请求都转到.net,所以您将不得不创建一个HttpModule,将这些标题添加到所有响应中。

如果没有IIS7,并且在共享主机上,您将不得不创建映射.net文件扩展名的处理程序(您不使用(如.asmx)),并在web.config中指定.asmx文件转到您的HttpHandler被设置为将路径重写为.jpg或其他内容,并在其中设置标题。

11

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

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

这等于2名的请求从浏览器(DNS查询除外)的资源:

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

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

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

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

而第4行只是打开响应的Accept-Encoding标头。否则,这种情况将不会出现在答复中。

有可插拔的模块,您可以编写/获取,允许您压缩多个其他MIME类型,如* .js和* .css,但最好使用IIS的内置压缩功能。

你还没说你正在使用的IIS的VERSON但如果它是IIS 7.0,它会要求你包括像下面进入你的<system.webserver>部分web.config文件:

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

..

理查德

+0

真的很简单的描述 – Rakeshyadvanshi 2016-02-24 18:07:06

37

这里是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> 

贷:How to GZip on ASP.NET and GoDaddy

+0

这一个工程.. – 2013-06-11 06:08:34

11

这可能是有用的,你试试看,这接受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"); 
     } 
    } 
0

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