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扩展方法包装它,您可以使其漂亮整洁。