2017-05-27 2 views
1

Je travaille sur une application ASP.NET Framework 2.0. Sur une page particulière, je fournis un lien vers l'utilisateur. En cliquant sur ce lien une fenêtre s'ouvre avec une autre page aspx. Cette page envoie en fait une requête http à une URL tierce qui pointe vers un fichier (comme - les URLs miroir pour télécharger un fichier à partir du cloud). La réponse http est renvoyée à l'utilisateur sur la toute première page en utilisant response.write d'où l'utilisateur clique sur le lien.Streaming asynchrone de fichiers volumineux à l'aide de ASP.Net Framework 2.0

Maintenant, le problème auquel je suis confronté est si la taille du fichier est faible, alors cela fonctionne très bien. Mais, si le fichier est volumineux (c'est-à-dire plus de 1 Go), alors mon application attend jusqu'à ce que le fichier entier soit téléchargé à partir de l'URL. J'ai essayé d'utiliser response.flush() pour envoyer un bloc par données de bloc à l'utilisateur, mais l'utilisateur n'est toujours pas en mesure d'utiliser l'application parce que le processus de travail est occupé à obtenir des flux de données provenant d'URL tierces.

Existe-t-il un moyen de télécharger des fichiers volumineux de façon asynchrone afin que ma fenêtre contextuelle termine son exécution (le téléchargement sera en cours) et que l'utilisateur puisse effectuer d'autres activités parallèlement.

Merci, Suvodeep

Répondre

1

Utilisez WebClient pour lire le fichier distant. Au lieu de télécharger, vous pouvez prendre le flux à partir du WebClient. Mettez cela dans la boucle while() et poussez les octets du flux WebClient dans le flux de réponse. De cette façon, vous téléchargerez et téléchargerez async en même temps.

HttpRequest exemple:

private void WriteFileInDownloadDirectly() 
{ 
    //Create a stream for the file 
    Stream stream = null; 

    //This controls how many bytes to read at a time and send to the client 
    int bytesToRead = 10000; 

    // Buffer to read bytes in chunk size specified above 
    byte[] buffer = new byte[bytesToRead]; 

    // The number of bytes read 
    try 
    { 
     //Create a WebRequest to get the file 
     HttpWebRequest fileReq = (HttpWebRequest)HttpWebRequest.Create("Remote File URL"); 

     //Create a response for this request 
     HttpWebResponse fileResp = (HttpWebResponse)fileReq.GetResponse(); 

     if (fileReq.ContentLength > 0) 
      fileResp.ContentLength = fileReq.ContentLength; 

     //Get the Stream returned from the response 
     stream = fileResp.GetResponseStream(); 

     // prepare the response to the client. resp is the client Response 
     var resp = HttpContext.Current.Response; 

     //Indicate the type of data being sent 
     resp.ContentType = "application/octet-stream"; 

     //Name the file 
     resp.AddHeader("Content-Disposition", $"attachment; filename=\"{ Path.GetFileName("Local File Path - can be fake") }\""); 
     resp.AddHeader("Content-Length", fileResp.ContentLength.ToString()); 

     int length; 
     do 
     { 
      // Verify that the client is connected. 
      if (resp.IsClientConnected) 
      { 
       // Read data into the buffer. 
       length = stream.Read(buffer, 0, bytesToRead); 

       // and write it out to the response's output stream 
       resp.OutputStream.Write(buffer, 0, length); 

       // Flush the data 
       resp.Flush(); 

       //Clear the buffer 
       buffer = new byte[bytesToRead]; 
      } 
      else 
      { 
       // cancel the download if client has disconnected 
       length = -1; 
      } 
     } while (length > 0); //Repeat until no data is read 
    } 
    finally 
    { 
     if (stream != null) 
     { 
      //Close the input stream 
      stream.Close(); 
     } 
    } 
} 

WebClient lecture Stream:

using (WebClient client = new WebClient()) 
{ 
    Stream largeFileStream = client.OpenRead("My Address"); 
} 
+0

Ваньо, l'exemple est exactement le même ci-dessus HttpWebRequest que mon implémentation actuelle. Je fournis une URL http pour créer httpwebrequest. Mais le problème est qu'il boucle continuellement la boucle while jusqu'à la fin du fichier de 1 Go, puis le processus principal quitte la boucle while pour terminer le processus. –

+0

Comment utiliser Webclient de manière asynchrone pour que le fichier puisse être téléchargé en parallèle. Veuillez suggérer. –

+0

Mis à jour ma réponse. C'est ainsi que vous pouvez obtenir le flux à partir de WebClient. Ensuite, la logique est la même - tout en boucle et en lecture des morceaux. –