对于我正在处理的应用程序,我需要允许用户通过我们的网站上传非常大的文件(即可能很多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几乎可以立即开始流式传输请求,从而完全消除了原始问题。

07-27 13:37