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

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

100509 次浏览

对于压缩 JS 和 CSS 文件,您实际上必须在 IIS 级别处理它们,因为这些文件直接呈现,而不需要 ASP.NET 运行时。

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

内容编码头告诉浏览器,它需要在呈现之前解压缩内容。有些浏览器很聪明,无论如何都能根据内容的形状来判断这一点,但是最好还是直接说出来。

Accept 编码缓存设置的存在使得 gzip 内容的缓存版本不会被发送到只请求 text/html 的浏览器。

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

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

在没有 IIS7的情况下,在共享主机上,您必须创建一个处理程序来映射。不使用的 net 文件扩展名(如。Asmx) ,并在 web.config 中指定。Asmx 文件转到您的 HttpHandler,该处理程序被设置为将路径重写到。还是什么的,把标题也设置在那里。

它只压缩您的 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 和 * 。但是最好只使用 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" />

..

理查德

下面是 css 和 javascript 文件的解决方案:

<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

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

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

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

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

注意: 如果您使用的是较老版本的 IIS (小于 v7.5) ,您可能希望将 doDynamicCompress 设置为 false,因为该进程是 CPU 密集型的。这些问题在 IIS 7.5中得到了解决。

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

要么使用 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 可能会为您做得更好。

内容编码头告诉浏览器,它需要在呈现之前解压缩内容。有些浏览器很聪明,无论如何都能根据内容的形状来判断这一点,但是最好还是直接说出来。

Accept 编码缓存设置的存在使得 gzip 内容的缓存版本不会被发送到只请求 text/html 的浏览器。