HttpClient:使用HttpResponseMessage.Content.ReadAsStreamAsync()时限制响应(下载文件)大小

时间:2013-12-18 17:37:47

标签: c# dotnet-httpclient

我正在寻找一种方法来监控下载文件的大小,同时使用以下代码:

    var client = new HttpClient();

    HttpResponseMessage resp = await client.GetAsync(mediaUri, HttpCompletionOption.ResponseHeadersRead);

    using (var fileStream = File.Create(outputPath))
    {
        using (var httpStream = await resp.Content.ReadAsStreamAsync())
        {
            httpStream.CopyTo(fileStream);
            fileStream.Flush();
        }
    }

如何阻止下载大于预定义大小的文件?

修改

在下面的答案出现之前,我使用此替换CopyTo。我将它放在这里可能会对以下答案中的ProgressMessageHandler产生影响:

            using (var fileStream = File.Create(outputPath))
            {
                using (var httpStream = await resp.Content.ReadAsStreamAsync())
                {
                    // instead of httpStream.CopyToAsync(fileStream);
                    byte[] buffer = new byte[65536];
                    while (true)
                    {
                        int read = await httpStream.ReadAsync(buffer, 0, buffer.Length, ct);
                        if (read <= 0)
                            break;

                        // do the policing here

                        await fileStream.WriteAsync(buffer, 0, read);
                    }
                    fileStream.Flush();
                }
            }

2 个答案:

答案 0 :(得分:3)

尝试检查the resp.Content.Headers.ContentLength property,其中应包含文件大小(以字节为单位)。

答案 1 :(得分:2)

如果Richard的答案没有用,因为内容是分块的,那么你应该查看属于WebAPI.Client nuget的ProgressMessageHandler,它定期接收事件并允许你监视传输的字节。如果传输的字节数超过一定数量,则可以使用此事件处理程序取消操作。