【问题标题】:Compress the Response has no effect压缩响应没有效果
【发布时间】:2019-06-26 05:27:38
【问题描述】:

我想在我的Asp.Net 网站上压缩回复。我写了这段代码:

public static void CompressPage(HttpRequest Request, HttpResponse Response)
{
    string acceptEncoding = Request.Headers["Accept-Encoding"];
    Stream prevUncompressedStream = Response.Filter;

    if (acceptEncoding.IsEmpty())
    {
        return;
    }

    acceptEncoding = acceptEncoding.ToLower();

    if (acceptEncoding.Contains("gzip"))
    {
        Response.Filter = new GZipStream(prevUncompressedStream, CompressionMode.Compress);
        Response.AppendHeader("Content-Encoding", "gzip");
    }
    else if (acceptEncoding.Contains("deflate"))
    {
        Response.Filter = new DeflateStream(prevUncompressedStream, CompressionMode.Compress);
            Response.AppendHeader("Content-Encoding", "deflate");
    }
}

并称之为Page_Load事件:

protected void Page_Load(object sender, EventArgs e)
{
    ...
    ZipHtmlPage.CompressPage(Request, Response);
}

问题是当我在Page_Load 中运行带有和不带有上述代码的代码时,响应的大小不会改变。

问题出在哪里?

谢谢


编辑 1)

我认为"Content-Encoding", "gzip" 不会添加到标题中:

不知道为什么?


编辑 2)

当我使用HttpModule 进行http 压缩时:

public class CompressModule : IHttpModule
{
    public void Init(HttpApplication application)
    {
        application.BeginRequest += (new EventHandler(this.Application_BeginRequest));
    }

    private void Application_BeginRequest(Object source, EventArgs e)
    {
        HttpContext context = HttpContext.Current;
        context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
        HttpContext.Current.Response.AppendHeader("Content-Encoding", "gzip"); 
    }
    public void Dispose()
    {
    }
}

我在每一页都有这个:

【问题讨论】:

  • 谷歌搜索asp.net enable gzip 有许多可能的想法可以尝试。您尝试过其中任何一个吗?
  • @mjwills 我不想用IIS 这样做。我想压缩几页
  • 建议在 IIS 级别上进行,而不是构建自己的中间件。
  • 是的,我非常同意@ArtemIgnatovich 的观点,重新发明轮子不是日常工作,当我们可以利用 WebServer 中提供的功能时,不建议您自己实现。

标签: c# asp.net gzip response http-compression


【解决方案1】:

您是否将这些代码添加到您的 web.config 文件(用于 css 和 javascript 文件):

<system.webServer>
    <httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
      <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" staticCompressionLevel="9" />
      <dynamicTypes>
        <add mimeType="text/*" enabled="true" />
        <add mimeType="message/*" enabled="true" />
        <add mimeType="application/x-javascript" enabled="true" />
        <add mimeType="application/json" enabled="true" />
        <add mimeType="*/*" enabled="false" />
      </dynamicTypes>
      <staticTypes>
        <add mimeType="text/*" enabled="true" />
        <add mimeType="message/*" enabled="true" />
        <add mimeType="application/x-javascript" enabled="true" />
        <add mimeType="application/atom+xml" enabled="true" />
        <add mimeType="application/xaml+xml" enabled="true" />
        <add mimeType="*/*" enabled="false" />
      </staticTypes>
    </httpCompression>
...

也许这个链接对你有帮助 How to implement GZip compression in ASP.NET?

【讨论】:

    【解决方案2】:

    我认为您添加压缩的方式是非标准的。我过去所做的是在启动文件中配置 GZip。 我还注意到压缩在调试模式下没有生效。 尝试在发布模式下部署或运行​​您的应用,看看它是否会压缩响应。

    在我的启动配置服务方法中,我有这个:

    services.Configure<GzipCompressionProviderOptions>(options =>
    {
        options.Level = CompressionLevel.Optimal;
    });
    

    【讨论】:

      【解决方案3】:

      这样压缩页面不是正确的方法,首先,您需要检查浏览器是否接受gzipdeflate 然后开始压缩,这就是您看到连线字符的原因。

      private void Application_BeginRequest(Object source, EventArgs e)
      {
          // wrong and dangerous
          HttpContext context = HttpContext.Current;
          context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
          HttpContext.Current.Response.AppendHeader("Content-Encoding", "gzip"); 
      }
      

      更好的方法:

      void context_BeginRequest(object sender, EventArgs e)
      {
          var app = (HttpApplication)sender;
          var encodings = app.Request.Headers.Get("Accept-Encoding");
      
      
          if (encodings == null)
              return;
      
          var baseStream = app.Response.Filter;
      
      
          // check if browser accepts gzip or deflate
          if (encodings.ToLower().Contains("gzip"))
          {
              app.Response.Filter = new GZipStream(baseStream, CompressionMode.Compress);
              app.Response.AppendHeader("Content-Encoding", "gzip");
              app.Context.Trace.Warn("GZIP compression on");
          }
          else if (encodings.ToLower().Contains("deflate"))
          {
              app.Response.Filter = new DeflateStream(baseStream, CompressionMode.Compress);
              app.Response.AppendHeader("Content-Encoding", "deflate");
              app.Context.Trace.Warn("Deflate compression on");
          }
      }
      

      我推荐使用名为HttpCompress 的库,您可以访问它here。又如其他人所说,为什么不使用内置的 IIS 压缩模块?

      【讨论】:

      • 感谢 Ali,但我在 FireFox 上运行了我的代码,我完全确定它接受 gzip。这是我的本地测试。
      • @Arian 每个浏览器和客户端都接受 gzip 吗?
      • 不,但正如我所说,这是我的本地测试。如果成功,我会为所有浏览器编写更好的代码
      猜你喜欢
      • 1970-01-01
      • 2012-01-19
      • 1970-01-01
      • 2012-02-12
      • 2018-10-10
      • 2020-10-05
      • 1970-01-01
      • 2021-05-24
      • 2015-12-13
      相关资源
      最近更新 更多