【问题标题】:Does .NET's HttpWebResponse uncompress automatically GZiped and Deflated responses?.NET 的 HttpWebResponse 是否会自动解压缩 GZiped 和 Deflated 响应?
【发布时间】:2010-10-15 06:43:18
【问题描述】:

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

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

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

【问题讨论】:

  • 我猜 Rick Strahl 一定是错的。你自己试过吗?
  • 谢谢 - 只是想理解一些事情,你能告诉我这是否正确吗? (a)如果您不添加此“AcceptEncoding”行,那么 - 如果您下载非压缩文件 => 工作正常 - 如果您下载压缩文件 => ISSUE(将下载文件但看起来会损坏,因为不是未压缩)(b)如果您添加此“AcceptEncoding”行,则: - 如果您下载非压缩文件 => 仍然可以正常工作 - 如果您下载压缩文件 => 可以正常工作(将未压缩)这是对的吗?
  • @Greg 没有任何选项。第二行不是关于下载可能已经压缩的文件(即 zip 文件),而是关于下载可能按需压缩的 Web 资源(即 html 文件)。如果你不放第二行,一个表现良好的 Web 服务器根本不会向你发送压缩文件。如果 web 服务器有能力压缩文件,它只会在你放第二行的时候做。
  • 也为这个问题投票:)

标签: c# .net httpwebrequest gzip deflate


【解决方案1】:

对于 .NET Core,涉及的内容要多一些。需要GZipStream,因为AutomaticCompression 没有属性(截至撰写时)考虑以下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}";
        }
    }
}

【讨论】:

    【解决方案2】:

    我找到了答案。

    您可以将代码更改为:

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

    你将有自动解压。无需更改其余代码。

    【讨论】:

    • 不错的答案,帮了我很多:)
    • 从技术上讲,您只需要一行“AutomaticDecompression”。它似乎会自动将“gzip,deflate”添加到标题中。
    • 即使响应没有被压缩,设置自动解压有什么问题吗?据此,服务器不压缩每个响应是正常的:developer.mozilla.org/en-US/docs/Web/HTTP/Headers/…
    【解决方案3】:

    GZIP 和 Deflate 响应不会自动处理。详情见这篇文章:HttpWebRequest and GZip Http Responses

    【讨论】:

    • 抱歉,我把它和 HttpListener 的请求和响应类混在一起了。 .Net 中的标准 Web 请求确实可以处理压缩响应。
    【解决方案4】:

    我认为您必须自己解压缩流。这是一篇关于如何做到这一点的文章:

    http://www.west-wind.com/WebLog/posts/102969.aspx

    【讨论】:

    • 很好的发现。看起来这是在 .NET 2.0 中添加的。也许 Strahl 在写他的文章时已经习惯了 1.1
    • 使用 HttpWebRequest.AutomaticDecompression 自动添加正确的请求头并处理解压。
    • 我不认为 AutomaticDecompression 会添加“Accept-Encoding”=gzip, deflate to headers。我使用的是 .NETCF3.5,除非我使用 request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 2011-06-01
    相关资源
    最近更新 更多