3

上传 84MB 的文件时出现此错误(请参阅下面的错误),但是当我上传 ~60MB 的文件时,它可以正常工作。这只发生在我们的 32 位 2008 虚拟机 w/4GB 内存上。在我的带有 8GB 内存的 R2 64 位 VM 上,即使是 130MB 文件也能正常工作。

System.OutOfMemoryException:引发了“System.OutOfMemoryException”类型的异常。在 System.IO.BinaryReader.ReadBytes(Int32 count) at CustWeb.Controllers.DownloadsController.Create(Download dl, HttpPostedFileBase file) in c:\...\CustWeb\Controllers\DownloadsController.cs:line 72

不过,我在任务管理器中监控了内存,在整个上传过程中它从未超过 74%。

这是 4.5 .NET 框架上的 MVC 4 应用程序。

我的 web.config 中有处理上传文件的最大设置。

<httpRuntime requestValidationMode="4.5" targetFramework="4.5" maxRequestLength="2147483647" executionTimeout="84000" />

...

<security>
     <requestFiltering>
         <requestLimits maxAllowedContentLength="2147482624" />
     </requestFiltering> 
</security>

更新按要求添加代码:

    public ActionResult Create(Download dl, HttpPostedFileBase file)
    {
        try
        {
            using (var binaryReader = new BinaryReader(file.InputStream))
            {
                dl.FileBytes = binaryReader.ReadBytes(file.ContentLength);
            }
            dl.FileContentType = file.ContentType;
            dl.FileName = file.FileName;
            dl.Insert();
            Success("<strong>" + dl.Label + "</strong> created and uploaded successfully.");
            return RedirectToAction("Index");
        }
        catch (Exception ex)
        {
            SelectList list = new SelectList(new DownloadType().GetDownloadTypes(), "ID", "Name");
            ViewBag.DownloadTypeList = list;
            Error(ex.ToString());
            return View(dl);
        }
    }
4

2 回答 2

3

默认情况下,ASP.NET 允许使用 60% 的可用内存 - 检查machine.config 中 processModel 中的 memoryLimit。您可以将该值更改为 80%,以便为 ASP.NET 提供更多空间,但不建议这样做。考虑其他选项,例如分块上传文件等。

于 2013-06-03T21:37:17.067 回答
0

我将它从 stream 更改为 file.SaveAs 并防止了内存错误。

    public ActionResult Create(Download dl, HttpPostedFileBase file)
    {
        try
        {
            string tempFile = Path.Combine(Server.MapPath("~/App_Data/"), string.Format("{0}_{1}",Guid.NewGuid().ToString(), Path.GetFileName(file.FileName)));
            file.SaveAs(tempFile);
            dl.FileBytes = System.IO.File.ReadAllBytes(tempFile);
            dl.FileContentType = file.ContentType;
            dl.FileName = file.FileName;
            dl.Insert();
            System.IO.File.Delete(tempFile);
            Success("<strong>" + dl.Label + "</strong> created and uploaded successfully.");
            return RedirectToAction("Index");
        }
        catch (Exception ex)
        {
            SelectList list = new SelectList(new DownloadType().GetDownloadTypes(), "ID", "Name");
            ViewBag.DownloadTypeList = list;
            Error(ex.ToString());
            return View(dl);
        }
    }
于 2013-06-05T15:50:05.503 回答