Httpclient Content-Length始终为0字节

时间:2020-10-05 03:14:27

标签: c# httpclient desktop-application .net-framework-version

有人可以帮我吗,获取视频文件的内容长度仍然有问题。我正在尝试下载流视频文件。但我从响应中只能得到0byte。

这是我当前的代码。我不知道如何正确设置内容类型。你能帮我吗?

public async Task StartDownload(CancellationToken token)
        {
            Uri uri = new Uri(DownloadUrl, UriKind.Absolute);
            SetConnection(uri);
            using (var request = new HttpRequestMessage(HttpMethod.Get, uri)) {
                request.RequestUri = uri;
                request.Headers.Referrer = uri;
                request.Headers.UserAgent.ParseAdd(UserAgent);
                using (var response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, token)) {
                    token.ThrowIfCancellationRequested();
                    await DownloadFileFromHttpResponseMessage(response, token);
                }
            }
        }
        private async Task DownloadFileFromHttpResponseMessage(HttpResponseMessage response, CancellationToken token)
        {
            response.EnsureSuccessStatusCode();
            using (var contentStream = await response.Content.ReadAsStreamAsync())
            {
                using (var content = new StreamContent(contentStream))
                {
                    content.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/octet-stream");
                    long? totalBytes = response.Content.Headers.ContentLength;
                    Console.WriteLine(totalBytes.GetValueOrDefault());

                    long totalBytesRead = 0;
                    long readCount = 0;
                    byte[] buffer = new byte[4096];
                    bool isMoreToRead = true;

                    using (var fileStream = new FileStream(OutputFilePath, FileMode.Create, FileAccess.Write, FileShare.None))
                    {
                        do
                        {
                            token.ThrowIfCancellationRequested();
                            int bytesRead = await contentStream.ReadAsync(buffer, 0, buffer.Length, token);
                            if (bytesRead == 0)
                            {
                                isMoreToRead = false;
                                TriggerProgressChanged(totalBytes, totalBytesRead);
                                continue;
                            }
                            await fileStream.WriteAsync(buffer, 0, bytesRead);

                            totalBytesRead += bytesRead;
                            readCount += 1;

                            if (readCount % 10 == 0)
                            {
                                TriggerProgressChanged(totalBytes, totalBytesRead);
                            }
                        }
                        while (isMoreToRead);
                    }
                    TriggerProgressChanged(totalBytes, totalBytesRead);
                }
            }
        }
        private void TriggerProgressChanged(long? totalDownloadSize, long totalBytesRead)
        {
            if (ProgressChanged == null) { return; }

            double? progressPercentage = null;
            if (totalDownloadSize.HasValue) {
                progressPercentage = Math.Round((double)((double)totalBytesRead / totalDownloadSize * 100), 2);
           }
            ProgressChanged(totalDownloadSize, totalBytesRead, progressPercentage);
        }

0 个答案:

没有答案