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

C# HttpClient:使用HttpResponseMessage.Content.ReadAsStreamAsync()时限制响应(下载的文件)大小,c#,dotnet-httpclient,C#,Dotnet Httpclient,我正在寻找一种方法来监控下载文件的大小,同时使用以下代码: var client = new HttpClient(); HttpResponseMessage resp = await client.GetAsync(mediaUri, HttpCompletionOption.ResponseHeadersRead); using (var fileStream = File.Create(outputPath)) { using (var

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

    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();
                }
            }
使用(var fileStream=File.Create(outputPath))
{
使用(var httpStream=await resp.Content.ReadAsStreamAsync())
{
//而不是httpStream.CopyToAsync(fileStream);
字节[]缓冲区=新字节[65536];
while(true)
{
int read=wait httpStream.ReadAsync(buffer,0,buffer.Length,ct);

如果(阅读尝试检查,其中应包含以字节为单位的文件大小。

尝试检查,其中应包含以字节为单位的文件大小。

如果Richard的回答没有帮助,因为内容是分块的,那么您应该查看作为WebAPI.Client nuget的一部分的
ProgressMessageHandler
,该客户端nuget会根据使用此事件处理程序,如果传输的字节超过一定数量,则可以取消操作。

如果Richard的回答因内容被分块而无效,则应查看作为WebAPI一部分的
ProgressMessageHandler
。客户端nuget定期接收事件并允许您监视传输的字节。使用此事件处理程序,如果传输的字节超过一定数量,您可以取消该操作。

假设内容未分块。我对此的成功与否参差不齐,因为似乎不是所有服务器都将其包含在响应中。几年前,but仍然…。@G.Stoynev:我还没有尝试过,但我看到一个建议,即
HttpClient
缓冲响应,即使服务器没有发送,也应该正确返回内容长度。我相信我特别指示不要使用
HttpCompletionOption.ResponseHeadersRead
@G.Stoynev Correctess将所有内容下载到一个缓冲区,然后说,“不,你不能下载内容!”假设内容没有分块。我的成功与否参差不齐,因为似乎不是所有服务器都将其包含在响应中。几年前,但仍然…。@G.Stoynev:我没有尝试过,但我看到了一个建议,
HttpClient
缓冲响应,即使服务器没有发送,也应该正确返回内容长度。我相信我特别指示不要使用
HttpCompletionOption进行缓冲。ResponseHeadersRead
@G.Stoynev Correct。将所有内容下载到缓冲区,然后说:不,你不能下载内容,这有点毫无意义!是的,您的解决方案应该可以很好地工作。如果您使用ReadAs扩展方法包装它,您可以使其变得漂亮整洁。是的,您的解决方案应该可以很好地工作。如果您使用ReadAs扩展方法包装它,您可以使其漂亮整洁。