在我工作的ASP.net网站上,以下代码块负责处理文件下载(注意:此处未使用Response.TransmitFile,因为下载内容是从zip文件中流式传输):
我们的用户经常下载几百兆字节的文件,这可能会很快地消耗服务器内存。我的假设是这是由于响应缓冲造成的。这个解释有道理吗?
我刚刚了解到 Response 对象的 'buffer' 属性。如果我将其设置为 false,那么是否可以防止 Response.BinaryWrite() 调用在内存中缓冲数据?一般来说,在这种情况下限制内存使用的好方法是什么?也许我应该从 zip 流式传输到临时文件,然后调用 Response.TransmitFile()?
编辑:除了可能的解决方案,我非常感兴趣的是上述代码中存在的内存使用问题的解释。为什么这会消耗超过1MB,即使在每次循环迭代中都调用了 Response.Flush?这只是在每次循环迭代时发生的不必要的堆分配(并且不会立即得到垃圾回收),还是有其他因素起作用?
private void DownloadFile( Stream stream)
{
int bytesRead;
int chunkSize = 1048576; //1MB
byte[] readBuffer = new byte[chunkSize];
while ((bytesRead = stream.Read(readBuffer, 0, readBuffer.Length)) != 0)
{
if(!Response.IsClientConnected)
break;
byte[] chunk = new byte[bytesRead];
Array.Copy(readBuffer,0,chunk,0,bytesRead);
Response.BinaryWrite(chunk);
Response.Flush();
}
stream.Close();
}
我们的用户经常下载几百兆字节的文件,这可能会很快地消耗服务器内存。我的假设是这是由于响应缓冲造成的。这个解释有道理吗?
我刚刚了解到 Response 对象的 'buffer' 属性。如果我将其设置为 false,那么是否可以防止 Response.BinaryWrite() 调用在内存中缓冲数据?一般来说,在这种情况下限制内存使用的好方法是什么?也许我应该从 zip 流式传输到临时文件,然后调用 Response.TransmitFile()?
编辑:除了可能的解决方案,我非常感兴趣的是上述代码中存在的内存使用问题的解释。为什么这会消耗超过1MB,即使在每次循环迭代中都调用了 Response.Flush?这只是在每次循环迭代时发生的不必要的堆分配(并且不会立即得到垃圾回收),还是有其他因素起作用?
当前上下文中不存在名称为'buffer'的变量
- pilau