如果浏览器可以显示 deflate 的接受编码,它是否可以处理 .NET gzip 响应



我正在这个HTTPCombiner中查看这种方法:

private bool CanGZip(HttpRequest request)
{
    string acceptEncoding = request.Headers["Accept-Encoding"];
    if (!string.IsNullOrEmpty(acceptEncoding) &&
         (acceptEncoding.Contains("gzip") || acceptEncoding.Contains("deflate")))
        return true;
    return false;
}

如果返回 true,则使用 GZipStream 压缩响应。这是对的吗?

这是两种不同的算法:

  • http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3
  • http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.5

这里有一些代码:

  • http://www.singular.co.nz/blog/archive/2008/07/06/finding-preferred-accept-encoding-header-in-csharp.aspx

所以,根据协议,这是不对的,好像浏览器说"给我使用放气的内容",你不应该把它发回gzip。

GZip(基于Deflate)和Deflate是两种不同的算法,因此对"deflate"的请求绝对不应该返回gziped内容。

但是,如果接受标头包含"gzip"和"deflate"DeflateStream,则只需使用GZipStream即可解决此问题。

两者都包含在System.IO.Compression中,因此您不必编写自己的 deflate 算法或使用第三方实现。

通常大多数浏览器都理解GZip和Deflate。他们通过在请求标头中将其指定为 Accept-Encoding:gzip, deflate 来告诉服务器。HTTPCombiner优先考虑GZip。如果两种类型都存在,则 GZip 被赋予优先权。HttpCombiner只有在浏览器仅请求Defalte时才发送内容。

最新更新