【问题标题】:Can I detect if content has been compressed in my HttpModule?我可以检测我的 HttpModule 中是否已压缩内容吗?
【发布时间】:2011-03-25 15:51:33
【问题描述】:

我有一个 HttpModule,用于动态压缩来自 ASP.NET (MVC3) Web 应用程序的内容。该方法与this article 中的 CompressionModule 非常相似(其中模块将 GZip 过滤器应用于 HttpResponse 并设置正确的 Content-encoding 标头)。

出于某种原因,这需要在经典模式下运行,而不是集成管道模式。

我遇到的问题是,在某些启用了 IIS 压缩的服务器上,IIS 会压缩内容,然后我的模块会对其进行压缩。

结果是我将内容压缩了两次,并带有编码:

Content-encoding: gzip,gzip

一个来自 IIS,一个来自我的代码中的这一行:

 httpResponse.AppendHeader("Content-encoding", "gzip");

有谁知道一种方法,在经典模式下,我可以检查内容是否已经压缩,是否在服务器上启用了压缩,以绕过我自己的压缩?

在流水线模式下,这个检查很简单

if (httpResponse.Headers["Content-encoding"]!= null)
{
   return;
}

即检查是否有任何东西已经设置了内容编码,如果是,什么也不做。

但是,我在经典模式下被难住了。不幸的是,经典模式下不允许访问HttpResponse.Headers,所以我无法进行障碍检查。

感谢所有想法。

【问题讨论】:

  • 认为你只能在经典模式下通过 ISAPI 模块来做到这一点。

标签: c# asp.net iis


【解决方案1】:

理论上,您可以使用反射来查看HttpRequest._cacheHeaders 字段,其中 ASP.NET 显然以经典模式存储了所有尚未发送的标头:

if (this._wr is IIS7WorkerRequest)
{
    this.Headers.Add(HttpResponseHeader.MaybeEncodeHeader(name), HttpResponseHeader.MaybeEncodeHeader(value));
}
else if (flag)
{
    if (this._cacheHeaders == null)
    {
        this._cacheHeaders = new ArrayList();
    }
    this._cacheHeaders.Add(new HttpResponseHeader(knownResponseHeaderIndex, value));
}

【讨论】:

  • 确实如此 - 尽管真的希望不要对将在每个请求上调用的这段生产代码使用反射。
  • @Rob 使用已编译的 lambda 尝试这种方法 (rogeralsing.com/2008/02/26/…)。似乎产生了巨大的性能差异。
  • 现在这是一个有趣的方法 - 我会试一试。
  • 这对我不起作用。响应对象的 _headers 字段返回为 null。
【解决方案2】:

我找到了一种相对简单的方法来检查输出是否已经压缩;我的方法甚至适用于以经典模式运行的 IIS,尽管它可能被视为“黑客”,但我发现它的工作方式非常一致;这个想法或多或少如下

// checks if the response is already compressed
private bool IsResponseCompressed(HttpApplication app)
{
    string filter = app.Response.Filter.ToString().ToLower();
    if (filter.Contains("gzip") | filter.Contains("deflate")) 
    {
      return true;
    }
    return false;
}

基本上,代码通过检查响应过滤器名称来工作;如果输出流被压缩,则名称包含“gzip”或“deflate”,因此很容易检查压缩

【讨论】:

  • 这对我不起作用。 Response.Filter 是一个 Stream 并且 .ToString() 只返回 Stream 类的名称。
猜你喜欢
  • 1970-01-01
  • 2013-01-10
  • 2015-08-05
  • 2011-11-26
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
  • 2011-09-01
  • 2010-12-16
相关资源
最近更新 更多