MVC大文件上传内存不足

时间:2015-05-15 17:27:27

标签: c# asp.net-mvc memory file-upload sqlfilestream

.Net 4.5.1 - MVC5 - EF6

要求允许大文件上传(<200MB)。我有一个带有HttpPostedFileBase的ViewModel。我将其输入流设置为数据库实体非映射流属性。然后将其发送到存储库,我将复制流保存到SQLFileStream。一切正常。

然而......在大约4次上传后调试时,我收到System.OutOfMemory异常。我可以看到HttpRawUploadedContent正在继续增长,并且不再在内存中保留不再使用的PostedFiles。我究竟做错了什么?如何处理这些东西?有没有更好的办法?任何指导都表示赞赏。

AttachmentViewModel.cs

public class AttachmentViewModel
{
    #region Public Properties

    public int Id { get; set; }

    public string FileName { get; set; }

    [MaxFileSize]
    public HttpPostedFileBase PostedFile { get; set; }


    #endregion Public Properties
}

数据库FileEnitity上的非映射属性

    [NotMapped]
    public Stream PostedStream {  get; set; }

FileRepository.cs添加方法

    public override T Add(T entity)
    {
        base.Add(entity);

        //Save to generate ID
        _ctx.SaveChanges();

        using (var tx = new TransactionScope())
        {
            try
            {
                var id = entity.Id;

                var rowData =
                    _ctx.Database.SqlQuery<FileStreamData>(FileRowSelect, new SqlParameter("id", id))
                        .First();

                using (var dest = new SqlFileStream(rowData.Path, rowData.Transaction, FileAccess.Write))
                {
                    //Copy the posted stream to the SQLFileStream
                    entity.PostedStream.CopyTo(dest);
                }

                tx.Complete();
            }
            catch
            {
                //Error Uploading Stream Revert
                base.Remove(entity);
                _ctx.SaveChanges();
                throw;
            }
        }
        return entity;
    }

内存的屏幕截图 enter image description here

1 个答案:

答案 0 :(得分:0)

应该归功于@ kad1r,因为他指出了我正确的方向。 (即:不是Http)

原来我不明白requestLengthDiskThreshold实际上做了什么。

  

RequestLengthDiskThreshold应该小于   MaxRequestLength值并指示在什么点或'threashold'   请求将开始透明地缓存到磁盘上。

     

http://forums.asp.net/t/1680176.aspx?httpRuntime+maxRequestLength+vs+requestLengthDiskThreshold+

通过增加此值,IIS会将更多请求存储在内存中而不是磁盘上。