我应该如何修改这个压缩代码以防止双重编码

本文关键字:代码 编码 压缩 何修改 修改 我应该 | 更新日期: 2023-09-27 18:11:58

我使用的是相当标准的压缩代码,我在网上看到过很多地方浮动:

HttpRequestBase request = context.HttpContext.Request;
string acceptEncoding = request.Headers["Accept-Encoding"];
if (string.IsNullOrEmpty(acceptEncoding))
    return;
acceptEncoding = acceptEncoding.ToUpperInvariant();
HttpResponseBase response = context.HttpContext.Response;
if (acceptEncoding.Contains("GZIP"))
{
    response.AppendHeader("Content-encoding", "gzip");
    response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
}
else if (acceptEncoding.Contains("DEFLATE"))
{
    response.AppendHeader("Content-encoding", "deflate");
    response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
}

在某些情况下,我有两个独立的代码片段,它们试图压缩流,但不知道它已经被压缩了。这导致我的头看起来像:

{Server=Microsoft-IIS%2f7.5&Content-encoding=gzip&Content-encoding=gzip&Location=%2fcsweb_IISVS2010%2fLogIn%3fReturnUrl%3d%252fcsweb_IISVS2010%252f&Set-Cookie=.ASPXFORMSAUTH%3d%3b+expires%3dTue%2c+12-Oct-1999+07%3a00%3a00+GMT%3b+path%3d%2f%3b+HttpOnly&X-AspNetMvc-Version=2.0}    System.Collections.Specialized.NameObjectCollectionBase {System.Web.HttpHeaderCollection}

您可以看到Content-encoding=gzip已被写入两次。

某些浏览器可以很好地处理这种情况,但不是所有浏览器——即FireFox和Safari。因此,我需要检查标题。我只是想确保我做得正确。

看起来最好的方法就是:

if( response.Headers.Keys["Content-encoding"] ) { do stuff }

但是KeysCollection没有"HasKey"方法。这样. .只有当我使用异常处理作为代码导航的一部分时,我才能看到这种方法有效——我真的不想这样做。

我的下一个想法是也许我可以清除头,然后重新追加,但看看有多少信息存储在头已经我认为这将是一个糟糕的选择。

. .这个问题似乎很容易解决,但我不确定怎么做才是正确的。任何帮助吗?

编辑:只是为了澄清…

在我的网上。我已经启用了"RadCompression",这是Telerik对其控件的压缩实现。这将导致一些响应被压缩(但不是全部)。然后,运行上面的c#代码——我需要检测它是否已经被编码。

EDIT2:哦……比预期的要容易。响应。header实际上包含两个东西——"header "。键[索引]以及头。AllKeys "

做一些类似response.Headers.AllKeys.Contains("Content-Encoding")就足够了

我应该如何修改这个压缩代码以防止双重编码

也许ServerVariables集合是跟踪这个请求是否已经完成的更好的地方?

context.HttpContext.Request.ServerVariables["gzip-header-added"] = true;

更新

头。Keys由NameValueCollection支持,如果找不到相关项,其字符串索引器返回null: http://msdn.microsoft.com/en-us/library/8d0bzeeb.aspx

所以你应该检查一下:

if( response.Headers.Keys["Content-encoding"] != null ) { do stuff }