Используя MVC 4, я пытаюсь создать контроллер веб-API, в который вы можете загрузить изображение. После завершения загрузки контроллер должен сохранить изображение в базе данных. Вот мой код:
[HttpPost]
public void UploadPhoto(int thirdPartyID)
{
if (!Request.Content.IsMimeMultipartContent())
throw new Exception(); // divided by zero
byte[] data = null;
var filename = string.Empty;
var provider = new MultipartMemoryStreamProvider();
Request.Content.ReadAsMultipartAsync(provider).ContinueWith(y =>
{
foreach (var file in provider.Contents)
{
filename = file.Headers.ContentDisposition.FileName.Trim('\"');
data = file.ReadAsByteArrayAsync().Result;
}
var image = this.GetImageFrom(data);
var member = this.GetMemberBy(thirdPartyID);
member.ProfileImage = data;
this.memberService.Save();
});
}
Проблема возникает, когда выполняется следующая строка:
this.memberService.Save();
Я использую Ninject и Entity Framework. Когда это выполняется, я получаю сообщение об ошибке: экземпляр ObjectContext был удален и больше не может использоваться для операций, требующих подключения. Я предполагаю, что это происходит из-за того, что «ContinueWith» выполняется асинхронно в другой области запроса, чем то, что мой DI связал с исходным DbContext? Вот мои привязки DI для моего UOW:
kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InScope(x => HttpContext.Current);
Я читал, как изменить DI, чтобы его область действия была привязана к объекту, но это большой проект, и на данном этапе мне неудобно менять корень композиции. У кого-нибудь есть обходной путь, который не включает изменение DI? Я попытался изменить строку
Request.Content.ReadAsMultipartAsync(provider).ContinueWith(y =>...
работать синхронно с
Request.Content.ReadAsMultipartAsync(provider).RunSynchronously();
or
Request.Content.ReadAsMultipartAsync(provider).Wait();
Метод «RunSynchronously» выдает ошибку, метод «Wait()» просто зависает. Мне просто нужно загрузить изображение, а затем сохранить его в базе данных.
РЕДАКТИРОВАТЬ Только что пришло это: Request.Content.ReadAsMultipartAsync никогда не возвращается. Я обновил свой код на основе этого сообщения, и это решило мою проблему!
Asynchronous File Upload using ASP.NET Web API
2. Пример кода:ASP.NET Web API: File Upload and Multipart MIME
3. Хорошее руководство:A guide to asynchronous file uploads in ASP.NET Web API RTM
- person Iman Mahmoudinasab   schedule 18.01.2014