我正在使用相当标准的压缩代码,我已经看到它在网上的许多地方浮动:
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”)就足够了。
答案 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 }