【问题标题】:Setting HttpWebRequest's AutomaticDecompression causes response ContentLength of -1设置 HttpWebRequest 的 AutomaticDecompression 会导致响应 ContentLength 为 -1
【发布时间】:2014-03-23 02:27:14
【问题描述】:

将 HttpWebRequest.AutomaticDecompression 设置为 gzip 后,响应的 ContentLength 属性返回 -1。 (在你说之前,是的,有响应内容!)这是一个大问题,因为我无法创建具有我需要从响应流中读取的字节数的字节数组。

我在 Fiddler 中分析了响应,ContentLength 属性是正确的,.NET 似乎不想使用它..

如果没有设置 AutomaticDecompression 属性,响应 ContentLength 会返回一个正的预期值。

我想利用内置的解压功能。任何想法为什么会发生这种情况?

我的代码:

        var request = (HttpWebRequest)WebRequest.Create(URI);
        request.ReadWriteTimeout = 300000;
        request.Timeout = 300000;
        request.ImpersonationLevel = TokenImpersonationLevel.Anonymous;
        request.Method = RequestMethod;
        if (RequestDetails.GzipCompress) request.Headers.Add("Accept-Encoding", "gzip");
        request.Accept = RequestDetails.Accept;
        request.ContentType = RequestDetails.ContentType;
        request.KeepAlive = RequestDetails.KeepAlive;
        request.ServicePoint.Expect100Continue = false;
        request.UserAgent = "UA";
        request.CookieContainer = null;
        request.Proxy = null;
        request.AutomaticDecompression = DecompressionMethods.GZip;
        if (RequestDetails.CustomHeaders != null) foreach (var pair in RequestDetails.CustomHeaders) request.Headers.Add(pair.Key, pair.Value);
        if (RequestData != null && RequestData.Length > 0)
        {
            request.ContentLength = RequestData.Length;
            using (var ps = request.GetRequestStream())
            {
                ps.Write(RequestData, 0, RequestData.Length);
            }   
        }
        HttpWebResponse response;
        try { response = (HttpWebResponse)request.GetResponse(); }
        catch (WebException ex) { response = (HttpWebResponse)ex.Response; }
        if (!request.HaveResponse || response == null) throw new Exception("No response! The operation may have timed out.");
        byte[] responseData = null;
        if (response.ContentLength > 0) //-1!!!

【问题讨论】:

    标签: c# http web


    【解决方案1】:

    已修复。不得不做 response.Headers[HttpResponseHeader.ContentLength]。

    请注意,这是压缩数据的大小。幸运的是,就我而言,我连接的服务器会发回一个 HTTP 标头,其中包含解压缩内容长度的大小。如果你没有,我想读取所有数据的唯一方法是声明一个静态大型缓冲区,并读取响应流,直到它返回读取的 0 字节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-04
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 2011-07-03
      • 1970-01-01
      相关资源
      最近更新 更多