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

Pra*_*ant 80 c# compression asp.net 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;
Run Code Online (Sandbox Code Playgroud)

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

谢谢

dor*_*zur 45

这是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"/>
Run Code Online (Sandbox Code Playgroud)

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

  • 应删除最后一行 (3认同)

Ben*_*man 28

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

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

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

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

  • 嗨@Ben,你能告诉我如何使用IIS压缩我的文件,我必须执行的所有设置,虽然我没有访问IIS配置,但我会尝试这样做.请告诉我如何使用IIS压缩文件?谢谢! (4认同)
  • http://stackoverflow.com/a/6992948/8479详细介绍了IIS7或更高版本所需的web.config的简单更改. (3认同)

Nud*_*ena 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");
        }
    } 
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢这段代码。我需要 gzip/deflate 特定站点的内容我无法访问 IIS 控制台,这对我有帮助。只是一个问题:这段代码似乎压缩了所有的 aspx 文件并压缩了 CSS 和 ScriptResources,但它没有压缩任何 .js 文件。有没有办法做到这一点?谢谢。 (2认同)

int*_*ion 11

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

<img src="www.example.com\exampleimg.jpg" alt="example" />
Run Code Online (Sandbox Code Playgroud)

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

  1. 对于aspx页面和
  2. 对于aspx页面包含的图像.

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

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

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

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

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

您还没有说过您正在使用的IIS版本,但如果它是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" /> 
Run Code Online (Sandbox Code Playgroud)

..

理查德