.Net 4.5.1 — MVC5 — EF6
Требование состоит в том, чтобы разрешить загрузку больших файлов (‹200 МБ). У меня есть ViewModel с HttpPostedFileBase. Я установил входной поток этого в свойство DB Entity NonMapped Stream. Который затем отправляется в репозиторий, где я сохраняю копию потока в 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;
}
Снимок экрана памяти