2009-01-12 51 views
2

我目前有一個基於.net的學校下載網站。我們提供防病毒,autocad,spss,辦公室和大量應用程序供學生下載。目前正在設置兩種方式中的一種來處理它們;超過800 megs的任何內容都可以通過單獨的網站直接訪問,而800 megs以下的.net代碼使用文件流保護,以10000字節塊的形式將其提供給用戶。我以這種方式提供下載問題的各種問題......我希望能夠保證大量下載,但.net網站無法處理它,而較小的文件通常會失敗。有沒有更好的方法呢?處理大型下載網站的最佳方法?

編輯 - 我只是想更新我最終如何解決這個問題:我最終將我的下載目錄添加爲iis中的虛擬目錄並指定了自定義http處理程序。處理程序從請求中獲取文件名並根據該請求檢查權限,然後將用戶重定向到錯誤/登錄頁面,或讓下載繼續。我對這個解決方案沒有任何問題,而且我已經在大概7個月的時間裏爲它提供了幾個演出的文件。

+0

我真的希望你已經聽到了你的母親在年輕時告訴你的情況...... – Mostlyharmless 2009-01-12 21:50:10

回答

1

我有兩個建議:

  • 增加緩衝區大小,以便有較少的迭代

AND/OR

  • 別叫IsClientConnected在每次迭代。

的原因是,根據Microsoft Guidelines

Response.IsClientConnected有一定的成本,所以用它接受一個手術前至少,說500毫秒(這是一個很長一段時間,如果你試圖維持每秒幾十頁的吞吐量)。作爲一般的經驗法則,不要在每一次緊密循環迭代中調用它

2

看着洪流。它是專門爲這種事情設計的,而且非常靈活。

+0

你會如何將BitTorrent下載與經過驗證的.NET網站集成? – 2010-11-04 19:36:16

+0

可以使用跟蹤器上的訪問控制(因爲跟蹤器在http上工作)並設置私有標誌來告訴客戶端不要使用對等交換和類似的協議。我這是一個明智的決定是一個不同的問題。如果下載是在局域網上,那麼bittorrent可能也不是一個好主意。 – CodesInChaos 2010-11-04 19:44:05

5

如果您遇到性能問題並且正在交付文件系統上存在的文件(而不是數據庫),請使用HttpResponse.TransmitFile函數。

至於失敗,你可能有一個錯誤。如果你發佈了代碼,你可能會做出更好的迴應。

0

使用健壯的網絡服務器(如Apache)有什麼問題,並讓它處理文件。就像您現在將較大的文件分隔到Web服務器一樣,爲什麼不以同樣的方式提供較小的文件呢?

有沒有一些隱藏的要求來防止這種情況?

0

好吧,這是它目前看起來像......

Stream iStream = null; 

// Buffer to read 10K bytes in chunk: 
byte[] buffer = new Byte[10000]; 

// Length of the file: 
int length; 

// Total bytes to read: 
long dataToRead; 

if (File.Exists(localfilename)) 
{ 
    try 
    { 
     // Open the file. 
     iStream = new System.IO.FileStream(localfilename, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read); 

     // Total bytes to read: 
     dataToRead = iStream.Length; 

     context.Response.Clear(); 
     context.Response.Buffer = false; 
     context.Response.ContentType = "application/octet-stream"; 
     Int64 fileLength = iStream.Length; 
     context.Response.AddHeader("Content-Length", fileLength.ToString()); 
     context.Response.AddHeader("Content-Disposition", "attachment; filename=" + originalFilename); 

     // Read the bytes. 
     while (dataToRead > 0) 
     { 
      // Verify that the client is connected. 
      if (context.Response.IsClientConnected) 
      { 
       // Read the data in buffer. 
       length = iStream.Read(buffer, 0, 10000); 

       // Write the data to the current output stream. 
       context.Response.OutputStream.Write(buffer, 0, length); 

       // Flush the data to the HTML output. 
       context.Response.Flush(); 

       buffer = new Byte[10000]; 
       dataToRead = dataToRead - length; 
      } 
      else 
      { 
       //prevent infinite loop if user disconnects 
       dataToRead = -1; 
      } 
     } 
     iStream.Close(); 
     iStream.Dispose(); 
    } 
    catch (Exception ex) 
    { 
     if (iStream != null) 
     { 
      iStream.Close(); 
      iStream.Dispose(); 
     } 
     if (ex.Message.Contains("The remote host closed the connection")) 
     { 
      context.Server.ClearError(); 
      context.Trace.Warn("GetFile", "The remote host closed the connection"); 
     } 
     else 
     { 
      context.Trace.Warn("IHttpHandler", "DownloadFile: - Error occurred"); 
      context.Trace.Warn("IHttpHandler", "DownloadFile: - Exception", ex); 
     } 
     context.Response.Redirect("default.aspx"); 
    } 
} 
+0

(1)line「buffer = new Byte [10000];」 (2)您是否嘗試增加緩衝區大小? – 2009-01-12 21:53:30

+0

1 - 我可以解決這個問題...這是我繼承的代碼,所以我把它留在了。2 - 我已經使用了緩衝區大小,但它似乎沒有任何幫助,所以我把它放在10000 – Arthurdent510 2009-01-12 21:59:22

0

有很多的許可限制......比如我們有說在校園任何技術人員可以下載Office 2007的許可協議並安裝Office,但不是學生。所以我們不讓學生下載它。所以我們的解決方案是將這些下載隱藏在.net後面。

0

Amazon S3聽起來非常適合您的需求,但它是商業服務,fileas是從服務器提供的。

你應該嘗試聯繫亞馬遜並要求學術定價。即使他們沒有。