.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;
}
内存的屏幕截图
答案 0 :(得分:0)
应该归功于@ kad1r,因为他指出了我正确的方向。 (即:不是Http)
原来我不明白requestLengthDiskThreshold实际上做了什么。
RequestLengthDiskThreshold应该小于 MaxRequestLength值并指示在什么点或'threashold' 请求将开始透明地缓存到磁盘上。
http://forums.asp.net/t/1680176.aspx?httpRuntime+maxRequestLength+vs+requestLengthDiskThreshold+
通过增加此值,IIS会将更多请求存储在内存中而不是磁盘上。