2013-06-20 123 views
3

我需要將通過Web服務獲取的文件傳遞給最終用戶。現在,我在兩個步驟這樣做:將文件從Web服務傳遞到ASP.NET中的客戶端

昏暗的客戶端作爲新Net.WebClient client.Headers.Add(「授權」,字符串:

  1. 從安全的Web服務獲取文件.Format( 「承載{0}」,的access_token))

    昏暗數據作爲字節()= client.DownloadData(URI)

  2. 經由http響應即成文件給用戶。

這是花了很長時間的最終用戶,因爲用戶必須等待服務器下載來自服務的文件,然後客戶端從服務器下載文件。

是否可以將文件直接從Web服務直接流式傳輸給用戶?如果是這樣,那麼最好的辦法是什麼?

+0

但是你把它,你仍然需要通過自己,你是最終的文件和最終用戶之間的代理流。您是否能夠在第一次流式傳輸時將文件存儲在您自己的服務器上,然後隨後的請求可以下載您保存的版本? – Darren

+0

我可以存儲該文件,但每個文件只能由單個用戶下載一次,因此該選項中的實用程序很少。我只是希望加快這個過程。 – Andy

回答

5

我認爲最好的方法是逐步下載文件並將其緩存到響應中,以逐步下載到客戶端。這樣,最終用戶不必等待服務器完全下載文件並將其發回。它只會在從其他位置下載文件內容時傳輸文件內容。作爲獎勵,您不必將整個文件保存在內存中或磁盤上!

下面是一個代碼示例實現這一目標:

protected void downloadButton_Click(object sender, EventArgs e) 
    { 
     Response.Clear(); 
     Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", "MyFile.exe")); 
     Response.Buffer = true; 
     Response.ContentType = "application/octet-stream"; 

     using (var downloadStream = new WebClient().OpenRead("http://otherlocation.com/MyFile.exe"))) 
     { 
      var uploadStream = Response.OutputStream; 
      var buffer = new byte[131072]; 
      int chunk; 

      while ((chunk = downloadStream.Read(buffer, 0, buffer.Length)) > 0) 
      { 
       uploadStream.Write(buffer, 0, chunk); 
       Response.Flush(); 
      } 
     } 

     Response.Flush(); 
     Response.End(); 
    } 
+0

優秀。太棒了。 – Andy

相關問題