2017-05-27 30 views
1

私はASP.NETフレームワーク2.0アプリケーションを開発中です。特定のページで私はユーザーへのリンクを提供しています。このリンクをクリックすると、別のaspxページが表示されたウィンドウが開きます。このページは実際にファイルを指し示すサードパーティのURLにHTTPリクエストを送信します(クラウドからファイルをダウンロードするためのミラーURLなど)。 http応答は、ユーザーがリンクをクリックした場所からのresponse.writeを使用して、最初のページのユーザーに返されます。ASP.Net Framework 2.0を使用した大規模ファイルの非同期ストリーミング

今、私が直面している問題は、ファイルサイズが小さいとうまくいきます。しかし、ファイルが大きい(1GBより大きい)場合、アプリケーションはURLからファイル全体がダウンロードされるまで待機します。私はチャンクデータでチャンクをユーザーに送信するためにresponse.flush()を使用しようとしましたが、ワーカープロセスがサードパーティのURLからのデータストリームを取得するためにアプリケーションを使用できません。

大きなファイルを非同期的にダウンロードして、ポップアップウィンドウの実行が完了して(ダウンロードが進行中)、アプリケーションで他のアクティビティを並行して実行できる方法はありますか。

おかげで、 Suvodeep

答えて

1

使用Webクライアントは、リモートファイルを読み込みます。ダウンロードする代わりに、WebClientからストリームを取得することができます。これをwhile()ループに入れ、WebClientストリームのバイトをResponseストリームにプッシュします。このようにして、非同期でダウンロードとアップロードが同時に行われます。

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の上記の例はまさに私の現在の実装と同じです。 httpwebrequestを作成するためのhttp URLを提供しています。しかし問題は、1GBファイルの終わりまでwhileループを連続的にループしてから、メインプロセスがwhileループを抜けてプロセスを終了することです。 –

+0

Webclientを非同期で使用すると、ファイルを並列にダウンロードできるようになります。提案してください。 –

+0

私の答えが更新されました。 WebClientからストリームを取得する方法です。それでは、ロジックは同じです - ループと読み込みチャンクです。 –

関連する問題