【问题标题】:The number of bytes return from HttpWebResponse's Stream doesn't equal to ContentLength从 HttpWebResponse 的 Stream 返回的字节数不等于 ContentLength
【发布时间】:2015-08-31 15:04:57
【问题描述】:

我正在使用HttpWebRequestHttpWebResponseStream 创建下载管理器。首先,我从HttpWebResponse 获得ContentLength,然后开始从流中读取文件内容并使用while 循环停止读取,当它完成时(Stream.Read 返回0,表示流结束),我注意到我没有t 接收所有字节(我对比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% 的文件。)

【问题讨论】:

    标签: c# http stream httpwebrequest httpwebresponse


    【解决方案1】:

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

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

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

    PS。如果您在一个团队中工作,请记住,大多数人都希望属性的 get 方法完全返回它最后一个 set 到的内容。

    【讨论】:

    • 谢谢,之前没注意过XD
    猜你喜欢
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    相关资源
    最近更新 更多