对于我正在处理的应用程序,我需要允许用户通过我们的网站上传非常大的文件(即可能很多GB)。不幸的是,ASP.NET MVC似乎先将整个请求加载到RAM中,然后再开始为它提供服务-对于这样的应用程序而言,这并非理想选择。值得注意的是,尝试通过以下代码来规避此问题:
if (request.Method == "POST")
{
request.ContentLength = clientRequest.InputStream.Length;
var rgbBody = new byte[32768];
using (var requestStream = request.GetRequestStream())
{
int cbRead;
while ((cbRead = clientRequest.InputStream.Read(rgbBody, 0, rgbBody.Length)) > 0)
{
fileStream.Write(rgbBody, 0, cbRead);
}
}
}
无法避开将请求缓冲到RAM的思路。是否有解决此问题的简便方法?
最佳答案
事实证明,我的初始代码基本上是正确的。唯一需要的更改是更改
request.ContentLength = clientRequest.InputStream.Length;
至
request.ContentLength = clientRequest.ContentLength;
前者在整个请求流中确定内容长度;后者仅检查
Content-Length
header ,仅要求 header 已完整发送。这使IIS几乎可以立即开始流式传输请求,从而完全消除了原始问题。