81

我正在尝试为我的 asp.net 页面(包括我的 CSS 和 JS 文件)实现 GZip 压缩。我尝试了以下代码,但它只压缩了我的 .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 服务器配置的共享托管服务器上)。而且在上面的代码中,我没有得到最后两行,为什么使用它们以及这些行的目的是什么。请解释!

4

9 回答 9

47

这是css和javascript文件的解决方案。将以下代码添加到 web.config 文件中的 <system.webServer> :

<configuration>
  ...
  <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>
  ...
<configuration>

学分:如何在 ASP.NET 和 GoDaddy 上进行 GZip

于 2010-12-11T09:46:53.390 回答
28

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

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

content-encoding 标头告诉浏览器它需要在渲染之前解压缩内容。一些浏览器足够聪明,无论如何都可以根据内容的形状来解决这个问题,但最好直接告诉它。

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

于 2009-02-16T05:21:10.143 回答
17

这可能对您尝试有用,它接受 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");
        }
    } 
于 2011-12-10T23:10:14.767 回答
11

它仅压缩 ASPX 文件的原因是您编写的代码仅嵌入在 ASPX 文件中。ASPX 文件是与其包含的任何链接内容分开的请求。因此,如果您的 ASPX 页面包含:

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

这相当于从您的浏览器到资源的 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" /> 

..

理查德

于 2010-01-17T01:02:10.780 回答
3

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

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

于 2009-03-31T17:54:21.413 回答
2

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

于 2009-02-16T05:27:58.380 回答
0

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

于 2013-01-24T19:26:13.717 回答
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

于 2018-04-21T13:24:42.953 回答
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 标头告诉浏览器它需要在渲染之前解压缩内容。一些浏览器足够聪明,无论如何都可以根据内容的形状来解决这个问题,但最好直接告诉它。

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

于 2019-06-13T07:11:40.397 回答