2015-12-30 6 views
2

У меня есть сайт, на котором фотографы могут загружать фотографии. Сайт размещается на общем лазурном веб-приложении, а фотографии и миниатюры фотографий загружаются в хранилище Azure Blob, а запись записывается в db. Фотографы могут загружать потенциально до 700 мб фотографий за раз.Метод Async не работает с первого раза при загрузке нескольких изображений

Моя проблема

У меня был синхронный метод для загрузки, что А) принял возрастов, чтобы бежать и B) не с «Существует не хватает места на диске» сообщение об ошибке. Я предполагаю, что это связано с тем, что временная папка для общего веб-приложения Azure ограничена 200 МБ.

Я попытался реализовать асинхронный метод, чтобы ускорить загрузку, но он успешно завершил первую фотографию (т. Е. Записи blobs и db), а затем, похоже, просто зависает. Это моя первая попытка написать асинхронный метод.

Я также не знаю, как исправить проблему с размером папки temp.

Моего метод вызова

public static async Task<Tuple<bool, string>> UploadAsync(HttpPostedFileBase[] photos, Bookings booking, string photoType, ApplicationUser user) 
    { 

     // For each file to be uploaded 
     foreach (HttpPostedFileBase file in photos) 
     { 
      try 
      { 
       await UploadPhotoFromFileAsync(file, user, booking.BookingsId, photoType); 

      } 
      catch (Exception ex) 
      { 
       // Not Implemented 
      } 
     } 

     return new Tuple<bool, string>(true, "Photos uploaded successfully"); 
    } 

Моей фотография Загрузить метод

public static Task UploadPhotoFromFileAsync(HttpPostedFileBase file, ApplicationUser user, int bookingId, string photoType) 
    { 
     return Task.Run(() => 
     { 
      using (ApplicationDbContext dbt = new ApplicationDbContext()) 
      { 
       Bookings booking = dbt.Bookings.Find(bookingId); 

       // Craete a new record in the UserFiles table 
       Photos photo = new Photos(); 
       photo.BookingsId = booking.BookingsId; 
       photo.PhotoType = photoType; 
       photo.FileName = Path.GetFileName(file.FileName); 

       string confirmedDate = string.Empty; 
       if (booking.ConfirmedDate.HasValue) 
       { 
        DateTime actualConfirmedDate = booking.ConfirmedDate.Value; 
        confirmedDate = actualConfirmedDate.Year.ToString() + actualConfirmedDate.Month.ToString() + actualConfirmedDate.Day.ToString(); 
       } 

       string blobName = string.Empty; 
       string blobThumbName = string.Empty; 
       if (photoType == "SamplePhoto") 
       { 
        // Get the count of the sample photos in the gallery 
        List<Photos> samplePhotos = dbt.Photos.Where(m => m.BookingsId == booking.BookingsId && m.PhotoType == "SamplePhoto").ToList(); 

        blobName = "TS_" + booking.location.Location.Replace(" ", "") + "_" + booking.BookingsId.ToString() + "_" + confirmedDate + "_" + (samplePhotos.Count).ToString() + "_sample" + Path.GetExtension(file.FileName); 
        blobThumbName = "TS_" + booking.location.Location.Replace(" ", "") + "_" + booking.BookingsId.ToString() + "_" + confirmedDate + "_" + (samplePhotos.Count).ToString() + "_sample_thumb" + Path.GetExtension(file.FileName); 
       } 
       else 
       { 
        // Get the count of the sample photos in the gallery 
        List<Photos> photos = dbt.Photos.Where(m => m.BookingsId == booking.BookingsId && m.PhotoType == "GalleryPhoto").ToList(); 

        blobName = "TS_" + booking.location.Location.Replace(" ", "") + "_" + booking.BookingsId.ToString() + "_" + confirmedDate + "_" + (photos.Count).ToString() + Path.GetExtension(file.FileName); 
        blobThumbName = "TS_" + booking.location.Location.Replace(" ", "") + "_" + booking.BookingsId.ToString() + "_" + confirmedDate + "_" + (photos.Count).ToString() + "_thumb" + Path.GetExtension(file.FileName); 
       } 

       // Create the Thumbnail image. 
       CloudBlobContainer thumbnailBlobContainer = _blobStorageService.GetCloudBlobContainer("thumbnails"); 
       if (CreateThumbnailImageFromHttpPostedFileBase(file, blobThumbName, photo)) 
       { 
        photo.ThumbnailBlobName = blobThumbName; 
        photo.ThumbnailBlobUrl = thumbnailBlobContainer.Uri + "/" + blobThumbName; 
       } 

       CloudBlobContainer blobContainer = _blobStorageService.GetCloudBlobContainer("photos"); 
       photo.BlobName = blobName; 
       photo.BlobUrl = blobContainer.Uri + "/" + blobName; 

       photo.DateCreated = DateTime.Now; 
       photo.CreatedBy = user.Id; 

       dbt.Photos.Add(photo); 
       dbt.SaveChanges(); 

       booking.Photos.Add(photo); 
       dbt.SaveChanges(); 

       //Upload to Azure Blob Storage 
       CloudBlockBlob blob = blobContainer.GetBlockBlobReference(blobName); 
       blob.UploadFromStream(file.InputStream); 
      } 
     }); 
    } 
+0

это может помочь увеличить временный размер папки: http://blogs.msdn.com/b/codefx/archive/2012/04/10/sample-of-apr-10th-increase-asp-net -temp-folder-size-in-windows-azure.aspx – Kayani

+0

Привет, @ Кайани, я посмотрел на это, но у меня есть веб-приложение, а не облачный сервис. Вы знаете, как добиться этого для веб-приложения? – Andrew

ответ

0

Проблемы был фактически вызван длиной запроса, установленной в Web.Config. Он не был достаточно высоким, чтобы можно было загрузить размер загружаемых фотографий. Я просто добавил следующий код в Web.Config.

<system.web> 
    <httpRuntime targetFramework="4.5" maxRequestLength="1048576" executionTimeout="900" /> 
</system.web> 
<system.webServer> 
    <modules> 
     <remove name="FormsAuthentication" /> 
    </modules> 
</system.webServer> 
0

Библиотека Azure Storage включает в себя асинхронные методы, и вы должны воспользоваться тем. И вместо того, чтобы обернуть ваш метод контроллера с помощью Task.Run, вы можете использовать ASP.NET MVC's built-in async-capabilities.

Итак, первое, сделать метод асинхр контроллера:

public async Task<ContentResult> UploadPhotoFromFileAsync... 

Затем удалить все Task.Runs.

Наконец, вызовите асинхронную методу Azure Storage Библиотеки:

var blob = blobContainer.GetBlockBlobReference(blobName); 
await blob.UploadFromStreamAsync(file.InputStream); 
+0

Привет, Майкл, я пробовал это, но он все еще блокируется при первом запуске. Я проделал некоторое чтение и, похоже, зашел в тупик. Любая идея почему? – Andrew

 Смежные вопросы

  • Нет связанных вопросов^_^