.NET的HttpWebResponse会自动解压GZip和Deflate响应吗?

50

我正在尝试执行一个接受压缩响应的请求

var request = (HttpWebRequest)HttpWebRequest.Create(requestUri);
request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");

我想知道当我添加第二行时,是否需要手动处理解压缩。


我猜Rick Strahl可能是错的。你自己试过了吗? - Keltex
谢谢 - 我只是想理解一下,你能告诉我这是否正确吗? (a) 如果您不添加此“AcceptEncoding”行,则:
  • 如果您下载未压缩的文件=>正常工作
  • 如果您下载压缩文件=>问题(将下载文件但看起来损坏,因为未解压缩) (b) 如果您添加了此“AcceptEncoding”行,则:
  • 如果您下载未压缩的文件=>仍然正常工作
  • 如果您下载压缩文件=>正常工作(将被解压缩)。
这正确吗?
- Greg
1
@Greg,这些选项都不对。第二行并不是关于下载可能已经压缩过的文件(例如zip文件),而是关于下载可能按需压缩的网络资源(例如html文件)。如果您不加第二行,良好行为的Web服务器根本不会发送给您压缩过的文件。只有当Web服务器具备压缩文件的能力并且您添加了第二行时,它才会进行压缩。 - Jader Dias
给问题点个赞吧 :) - sumit_batcoder
4个回答

117

我找到了答案。

你可以将代码更改为:

var request = (HttpWebRequest)HttpWebRequest.Create(requestUri);
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;

你将会拥有自动解压功能,不需要更改其余代码。


5
技术上来说,你只需要一行代码:"AutomaticDecompression"。它似乎会自动将"gzip,deflate"添加到头部。 - LongZheng
即使响应未压缩,保留自动解压设置是否存在任何问题?根据此文档,服务器不压缩每个响应是正常的:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding - Joe Eng
如果您需要Brotli支持,可以考虑像这个答案中所示自己实现。 - Louis Somers

4

对于.NET Core,情况有些复杂。由于没有AutomaticCompression属性(截至撰写本文),因此需要使用GZipStream。请考虑以下GET示例:

var req = WebRequest.CreateHttp(uri);

/*
 * Headers
 */
req.Headers[HttpRequestHeader.AcceptEncoding] = "gzip, deflate";

/*
 * Execute
 */
try
{
    using (var resp = await req.GetResponseAsync())
    {
        using (var str = resp.GetResponseStream())
        using (var gsr = new GZipStream(str, CompressionMode.Decompress))
        using (var sr = new StreamReader(gsr))

        {
            string s = await sr.ReadToEndAsync();  
        }
    }
}
catch (WebException ex)
{
    using (HttpWebResponse response = (HttpWebResponse)ex.Response)
    {
        using (StreamReader sr = new StreamReader(response.GetResponseStream()))
        {
            string respStr = sr.ReadToEnd();
            int statusCode = (int)response.StatusCode;

            string errorMsh = $"Request ({url}) failed ({statusCode}) on, with error: {respStr}";
        }
    }
}

-1

抱歉,我把这个和HttpListener的请求和响应类混淆了。在.Net中,标准的Web请求确实可以处理压缩响应。 - Jeroen Landheer

-2

不错的发现。看起来这是在.NET 2.0中添加的。也许Strahl在写他的文章时还在使用1.1版本。 - Keltex
使用 HttpWebRequest.AutomaticDecompression 可以自动添加正确的请求头并处理解压缩。 - Armbrat
我认为AutomaticDecompression不会在头部添加"Accept-Encoding"=gzip, deflate。我正在使用.NETCF3.5,除非我使用request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate")将它们添加到头部,否则Headers不会有这个添加。 - pixel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接