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

时间:2011-10-20 18:40:20

标签: c# header compression response

我正在使用相当标准的压缩代码,我已经看到它在网上的许多地方浮动:

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”方法。因此......如果我将异常处理作为代码导航的一部分使用,我只能看到这种方法有效 - 我真的不想这样做。

我的下一个想法是,我可以清除标题,然后重新添加,但是看看已经存储在标题中的信息量,我认为这将是一个糟糕的选择。

所以......这个问题似乎很容易解决,但我不确定正确的方法。有什么帮助吗?

编辑:只是要清楚......

在我的web.config中,我启用了“RadCompression”,这是Telerik为其控件实现压缩的实现。这导致一些响应被压缩(但不是全部)。然后,运行上面的C#代码 - 我需要检测它已经被编码。

EDIT2:哦......比预想的要容易。 response.Headers实际上包含两件事 - “headers.Keys [index]以及headers.AllKeys”

做一些像response.Headers.AllKeys.Contains(“Content-Encoding”)就足够了。

1 个答案:

答案 0 :(得分:3)

或许ServerVariables集合可以更好地跟踪是否已经对此请求进行了此操作?

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

更新

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

所以你应该好好检查一下:

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