2017-05-27 56 views
1

我正在研究ASP.NET框架2.0應用程序。在特定頁面上,我提供了一個鏈接給用戶。通過點擊這個鏈接,一個窗口打開另一個aspx頁面。這個頁面實際上發送http請求到一個指向文件的第三方url(比如 - mirror urls從雲下載文件)。 http響應在第一頁使用response.write從用戶點擊鏈接返回給用戶。使用ASP.Net Framework 2.0異步傳輸大文件

現在,我面對的問題是如果文件大小很低,那麼它工作正常。但是,如果文件很大(即超過1 GB),那麼我的應用程序將等待整個文件從URL下載。我曾嘗試使用response.flush()將塊數據發送給用戶,但仍然無法使用應用程序,因爲工作進程正忙於從第三方URL獲取數據流。

是否有任何方式可以異步下載大文件,以便我的彈出窗口完成其執行(下載將在進行中),並且用戶還可以在應用程序中並行執行其他活動。

感謝, Suvodeep

回答

1

使用Web客戶端讀取遠程文件。您可以從WebClient獲取流,而不是下載。把它放在while()循環中,並在Response流中推送來自WebClient流的字節。這樣,您將同時進行異步下載和上傳。

的HttpRequest例如:

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的流讀取:

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

Ваньо,上述HttpWebRequest的例子是完全一樣的我目前的執行情況。我正在提供一個http url來創建httpwebrequest。但是問題是它通過while循環持續循環,直到1 GB文件結束,然後主進程退出while循環結束進程。 –

+0

如何異步使用Webclient,以便可以並行下載文件。請建議。 –

+0

更新了我的答案。這就是你如何從WebClient獲取流。然後邏輯是一樣的 - while循環和閱讀塊。 –