2015-06-11 5 views
0

У меня есть код, который хорошо подходит для небольших файлов, но для больших файлов он генерирует zip по мере необходимости, но не загружает его. Я получаю всевозможные ошибки, включая Timeout (которые мне удалось решить). Другая проблема заключается в том, что он работает в Sync. Самый большой файл, который я создал сам, - это почтовый файл размером 330 Мбайт с прикрепленным к нему около 30 HD-изображений. Но это может даже пойти на ГБ, так как пользователь может сразу загрузить около 100 или даже больше HD-изображений.Загрузить большой файл Async в ASP.NET C#

Для решения обеих проблем, я думал, что загрузка в async может помочь в обоих случаях. Я хочу предупредить пользователя о том, что их загрузка началась, и что они будут уведомлены, когда они будут готовы.

Я собираюсь отправить поток вниз, если клиент IsConnected (или удалить файл) или отправить электронное письмо, чтобы попросить их загрузить файл, если они решили выйти из системы (затем удалить файл, используя ссылку офлайн-скачивания) , Я просто не знаю, где и как писать код async, или если то, что я хочу сделать, на самом деле можно сделать, если пользователь решит выйти из системы.

Вот мой текущий код:

private void DownloadFile(string filePath) 
{ 
    FileInfo myfile = new FileInfo(filePath); 

    // Checking if file exists 
    if (myfile.Exists) 
    { 
     // Clear the content of the response 
     Response.ClearContent(); 

     // Add the file name and attachment, which will force the open/cancel/save dialog box to show, to the header 
     Response.AddHeader("Content-Disposition", "attachment; filename=" + myfile.Name); 

     // Add the file size into the response header 
     Response.AddHeader("Content-Length", myfile.Length.ToString()); 

     // Set the ContentType 
     Response.ContentType = "application/octet-stream"; 

     Response.TransmitFile(filePath); 
     Response.Flush(); 

     try 
     { 
      myfile.Delete(); 
     } 
     catch { } 
    } 
} 

ответ

0

Я не знаю, о Async загрузки из приложений ASP.NET, так что я не могу решить этот вопрос. Но у меня достаточно проблем с загрузкой, чтобы всегда начинать с того же места.

Сначала загрузите с общей ручки (ASHX), а не в веб-форму. Веб-форма хочет выполнить дополнительную обработку в конце запроса, который может вызвать проблемы. Вы не указали, используете ли вы веб-форму или общий обработчик.

Во-вторых, всегда завершайте запрос вызовом метода ApplicationInstance.CompleteRequest(). Не используйте Request.Close() или Request.End()

Эти два изменения часто очищают проблемы с загрузкой для меня. Попробуйте эти изменения и посмотрите, получите ли вы те же результаты. Даже если вы получите те же результаты, это лучший способ загрузки кодировок.

И, наконец, как в сторону, только поймать соответствующие исключения в боксе try-catch.

Ваш код будет выглядеть так:

public class Handler1 : IHttpHandler 
{ 

    public void ProcessRequest(HttpContext context) 
    { 
     // set from QueryString 
     string filePath = "..."; 

     FileInfo myfile = new FileInfo(filePath); 

     // Checking if file exists 
     if (myfile.Exists) 
     { 
      // Clear the content of the response 
      context.Response.ClearContent(); 

      // Add the file name and attachment, which will force the open/cancel/save dialog box to show, to the header 
      context.Response.AddHeader("Content-Disposition", "attachment; filename=" + myfile.Name); 

      // Add the file size into the response header 
      context.Response.AddHeader("Content-Length", myfile.Length.ToString()); 

      // Set the ContentType 
      context.Response.ContentType = "application/octet-stream"; 

      context.Response.TransmitFile(filePath); 
      context.Response.Flush(); 

      HttpContext.Current.ApplicationInstance.CompleteRequest(); 

      try 
      { 
       myfile.Delete(); 
      } 
      catch (IOException) 
      { } 
     } 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 
+0

Благодаря Gridly. Я буду применять это изменение и дам вам знать к завтра. – SollyM