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

C# 我应该如何修改此压缩代码以防止双重编码?,c#,header,compression,response,C#,Header,Compression,Response,我使用的是相当标准的压缩代码,我在网上的许多地方都看到过这种代码: HttpRequestBase request = context.HttpContext.Request; string acceptEncoding = request.Headers["Accept-Encoding"]; if (string.IsNullOrEmpty(acceptEncoding)) return; acceptEncoding = acceptEncoding.ToUpperInvar

我使用的是相当标准的压缩代码,我在网上的许多地方都看到过这种代码:

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 }
但是没有“HasKey”方法。像这样的只有在我将异常处理作为代码导航的一部分时,我才能看到这种方法起作用——我真的不想这么做

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

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

编辑:我只是想说清楚

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

编辑2:哦。。。比预期的容易。response.Headers实际上包含两个内容--“Headers.Keys[index]和Headers.AllKeys”


执行诸如response.Headers.AllKeys.Contains(“内容编码”)之类的操作就足够了。

也许ServerVariables集合是跟踪此请求是否已执行此操作的更好地方

context.HttpContext.Request.ServerVariables["gzip-header-added"] = true;
更新 Headers.Keys由NameValueCollection支持,如果找不到相关项,则其字符串索引器将返回null:

因此,您应该很好地检查:

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

虽然这个解决方案是完全有效的,而且肯定是更好的实践,但它不适用于我的场景。上面的代码就是我压缩它的地方,但是web.config中还有一个设置,它有时会压缩数据。我没有能力设置服务器变量,让我处于相同的位置。不过,我感谢你富有洞察力的回答!感谢您的帮助--我已将您标记为正确的帮助。您是否已检查以验证
response.Headers.Keys[“Content encoding”]
在未找到任何内容时是否引发异常。很多集合实际上只返回null。哈哈,我没有。。一秒钟。它只是在文档中说它返回ArgumentOutOfRangeException——但谁知道呢。一秒钟。