繁体   English   中英

设置HttpWebRequest的AutomaticDecompression导致响应ContentLength为-1

[英]Setting HttpWebRequest's AutomaticDecompression causes response ContentLength of -1

将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!!!

固定。 不得不做response.Headers [HttpResponseHeader.ContentLength]。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM