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

时间:2009-02-16 05:16:40

标签: c# asp.net compression gzip

我正在尝试为我的asp.net页面实现GZip压缩(包括我的CSS和JS文件)。我尝试了以下代码,但它只压缩我的.aspx页面(从YSlow找到它)

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

由于

9 个答案:

答案 0 :(得分:41)

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

答案 1 :(得分:28)

压缩JS&amp;您实际上必须在IIS级别处理的CSS文件,因为这些文件是在没有ASP.NET运行时的情况下直接呈现的。

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

内容编码标头告诉浏览器在渲染之前需要解压缩内容。根据内容的形状,有些浏览器足够聪明,无论如何都可以解决这个问题,但最好还是告诉它。

接受编码缓存设置存在,因此gzip压缩内容的缓存版本将不会发送到仅请求text / html的浏览器。

答案 2 :(得分:14)

这对你试用可能很有用,它接受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");
        }
    } 

答案 3 :(得分:11)

它仅压缩您的ASPX文件的原因是您编写的代码仅嵌入在ASPX文件中。 ASPX文件是来自其包含的任何链接内容的单独请求。因此,如果您有一个包含以下内容的ASPX页面:

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

这相当于从浏览器到资源的2个请求(除了DNS查询):

  1. 用于aspx页面和
  2. 用于aspx页面包含的图像。
  3. 每个请求都有自己的响应流。您发布的代码仅附加到ASPX响应流,这就是为什么只压缩您的ASPX页面。第1行和第1行你发布的代码中的2个基本上接管了页面的正常响应流并注入了一些“中间人”代码,在这种情况下,用GZip流来处理和压缩普通输出流,然后将其发送到网络中。

    第3行&amp; 4正在设置响应标头。所有http请求和响应都具有在内容之前发送的标头。这些设置请求/响应,以便服务器和客户端知道发送的内容和方式。

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

    Line 4只是打开响应的Accept-Encoding标头。否则,回复中就会出现这种情况。

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

    您还没有说过您正在使用的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" /> 
    

    ...

    理查德

答案 4 :(得分:3)

在IIS7中,所有请求都转到.net,因此您必须创建一个HttpModule,将这些标头添加到所有响应中。

如果没有IIS7,并且在共享主机上,您必须创建一个处理程序来映射您未使用的.net文件扩展名(如.asmx),并在web.config中指定.asmx文件转到您的HttpHandler设置为重写.jpg或其他任何路径,并在那里设置标题。

答案 5 :(得分:2)

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

答案 6 :(得分:0)

将.aspx扩展名添加到.css或.js文件中。使用&lt;%@ Page ContentType =“text / css”%&gt;或文件中的javascript以正确的MIME类型提供服务。 &安培;使用URL Rewrite将其隐藏在用户代理浏览器中。内容编码响应头附加gzip以传达gzip是用于执行压缩的方法。变量响应头设置为Accept-Encoding,因此所有缓存都知道应该提供哪个页面(压缩或未压缩)取决于请求的Accept-Encoding头。我在https://stackoverflow.com/a/14509007/1624169

详细阐述了这个问题

答案 7 :(得分:0)

您只需将以下内容添加到<system.webServer>元素中的web.config文件中:

<urlCompression doStaticCompression="true" doDynamicCompression="true" />

注意:如果您使用的是旧版本的IIS(低于v7.5),则可能需要将doDynamicCompression设置为false,因为该进程是CPU密集型的。这些问题已在IIS 7.5中清除。

参考:https://docs.microsoft.com/en-us/iis/configuration/system.webserver/urlcompression

答案 8 :(得分:0)

使用web.config文件

<system.webServer>
    <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>

或者您可以通过IIS来完成。对于压缩JS和CSS文件,实际上必须在IIS级别进行处理,因为这些文件无需ASP.NET运行时即可直接呈现。

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

content-encoding标头告诉浏览器在呈现之前需要解压缩内容。有些浏览器很聪明,可以根据内容的形状来解决这个问题,但是最好告诉它。

具有“接受编码缓存”设置,因此不会将压缩后的内容的缓存版本发送到仅请求text / html的浏览器。