我有一个HttpModule,用于动态压缩ASP.NET(MVC3)Web应用程序中的内容.该方法非常类似于在CompressionModule 本文(其中,模块应用一个gzip滤波器到的HttpResponse并设定正确的内容编码头).
出于某种原因,这需要在经典模式下运行,而不是集成管道模式.
我遇到的问题是,在某些启用了IIS压缩的服务器上,IIS会压缩内容,然后我的模块会压缩它.
结果是我通过编码将内容压缩两次:
Content-encoding: gzip,gzip
Run Code Online (Sandbox Code Playgroud)
一个来自IIS,一个来自我的代码中的这一行:
httpResponse.AppendHeader("Content-encoding", "gzip");
Run Code Online (Sandbox Code Playgroud)
在经典模式下,有没有人知道我可以检查内容是否已经压缩,或者是否在服务器上启用压缩,以绕过我自己的压缩?
在管道模式下,此检查非常简单
if (httpResponse.Headers["Content-encoding"]!= null)
{
return;
}
Run Code Online (Sandbox Code Playgroud)
即检查是否已经设置了内容编码,如果已经设置了内容编码,则不执行任何操作.
但是,我被困在经典模式中.不幸的是,HttpResponse.Headers在经典模式下不允许访问,因此我无法进行屏障检查.
所有的想法都感激不尽.
理论上,您可以使用反射来查看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));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1642 次 |
| 最近记录: |