从HttpWebResponse's Stream返回的字节数不等于ContentLength

本文关键字:返回 字节数 不等于 ContentLength Stream HttpWebResponse | 更新日期: 2023-09-27 18:10:37

我正在使用HttpWebRequest, HttpWebResponseStream创建下载管理器。首先,在开始从流中读取文件内容并使用while循环停止读取之前,我从HttpWebResponse中获得ContentLength,当它完成时(Stream.Read返回0,这意味着流结束),我注意到我没有收到所有字节(我与ContentLength相比)

这是我用来从流中读取字节的一些代码,计算内容长度到兆字节,我收到的字节数(兆字节)和我收到的字节的百分比。

                int maxReadSize = 102400;
                int readByte = 0;
                long downloadedSize = 0;
                int roundCount = 0;
                int byteCalRound = 0;
                byte[] buffer = new byte[maxReadSize];
                _currentFile.Status = DownloadStatus.Downloading;
                DateTime lastUpdate = DateTime.Now;
                do
                {
                    readByte = await _inStream.ReadAsync(buffer, 0, maxReadSize, _ct);
                    byteCalRound += readByte;
                    downloadedSize += readByte;
                    roundCount++;
                    if (roundCount == 5)
                    {
                        var now = DateTime.Now;
                        var interval = (now - lastUpdate).TotalSeconds;
                        var speed = (int)Math.Floor(byteCalRound / interval);
                        lastUpdate = now;
                        _currentFile.RecievedSize = downloadedSize;
                        _currentFile.Throughput = speed;
                        _currentFile.PercentProgress = downloadedSize;
                        byteCalRound = 0;
                        roundCount = 0;
                    }
                    await stream.WriteAsync(buffer, 0, readByte);
                } while (readByte != 0);
            }
            // Download completed
            _currentFile.Status = DownloadStatus.Complete;
            _currentFile.CompleteDate = DateTime.Now;
            ...
            // Calculate file size
            public double FileSize
            {
                get { return _fileSize; }
                set
                {
                    _fileSize = value / 1048576;
                }
            }
            // Calculate receive bytes
            public double RecievedSize
            {
                get { return _recievedSize; }
                set
                {
                    _recievedSize = value / 1048576;
                }
            }
            // Calculate percent
            public double PercentProgress
            {
                get { return _percentProgress; }
                set
                {
                    _percentProgress = value / 1048576 * 100 / _fileSize;
                }
            }

我一直在测试的结果(我下载的字节数)是有时我收到所有字节(我从PercentProgressRecievedSize检查)和
有时我收到99.6-99.9%的文件(再次,我从PercentProgressRecievedSize检查),所以,这是我面临的问题。

那么,问题是什么导致了这个问题?

请注意,我一直在测试下载视频在只有一个网站,因为我不认为这个问题只发生在这个网站(我通常通过Chrome下载,结果是我收到100%的文件。)

从HttpWebResponse's Stream返回的字节数不等于ContentLength

您正在读取的数字(PercentProgressReceivedSize)每5次循环只更新一次。如果有12个迭代,它们将反映前10个迭代的大小。

您可以在之后最后一次更新它们,即:

        ...
    } while (readByte != 0);
}
// Download completed
_currentFile.Status = DownloadStatus.Complete;
_currentFile.CompleteDate = DateTime.Now;
_currentFile.RecievedSize = downloadedSize;
_currentFile.PercentProgress = downloadedSize;

p。如果您在一个团队中工作,请记住,大多数人都希望属性的get方法返回set上次返回的内容。