2012-09-10 60 views
2

我們嘗試實施一個download.aspx來控制我們的源代碼,例如特定客戶端的圖像。我們在download.aspx.cs中使用緩衝方法。代碼如下所示:使用download.aspx時緩慢加載圖像

using (var fs = new FileStream(_path, FileMode.Open, FileAccess.Read)) 
{ 
    Response.BufferOutput = false; // to prevent buffering 
    byte[] buffer = new byte[1024]; 
    int bytesRead = 0; 
    if (_file.Extension == ".pdf") 
    { 
     Response.AddHeader("Content-Disposition", "inline; filename=" + _file.Name); 
    } 
    else 
    { 
     Response.AddHeader("Content-Disposition", "attachment; filename=" + _file.Name); 
    } 
    Response.AddHeader("Content-Length", _file.Length.ToString()); 
    Response.ContentType = ReturnExtension(_file.Extension.ToLower()); 

    while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     Response.OutputStream.Write(buffer, 0, bytesRead); 
    } 
} 

下載單個文件時效果很好。但是,在我們的情況下,我們嘗試同時加載約20張圖像。它變得非常緩慢。以下是捕獲的畫面: -

enter image description here

我們不能找出原因。我們想知道這是控制文件的一種實用方法,或者有其他更好的方法來實現它。

+0

你不能使用靜態服務嗎? –

+0

您是否試過單步執行此代碼以查看哪行最長執行?此外,請嘗試使用瀏覽器調試工具(網絡選項卡 - Internet Explorer中的F12,Chrome中的CTRL + SHIFT + J),查看是否有任何其他資源阻止下載。 –

+0

去Terric:Ya。我用鉻來調查執行時間。大部分時間都浪費在等待服務器的響應上。問題可能是由於服務器端問題。 – Gary

回答

0

我同意上述回覆。但是,如果這是你「必須走」的路線。你可以看看下面的內容。

你正在使用一個asp.net頁面,而不是去處理程序路線,你砍了很多的asp.net生命週期,這將有助於減少圖像加載時間。

Second have a look at Asynchronous HTTP Handler.

你也可以看看緩存響應輸出,這將有助於提高性能。 read this

我希望這些信息有些幫助。

+0

感謝您的有用信息。我可以看看並嘗試一下。 – Gary

+0

已經嘗試過。這比僅僅使用aspx.cs更好。謝謝 – Gary

0

Asp.net具有有限數量的工作線程。當你這樣做時,你會增加這些線程的負載很多倍。

最好讓IIS處理靜態內容。

本來應該是一個文件請求,現在至少有17個來自屏幕截圖的請求。 此負載會顯着降低您的服務器速度。

+0

感謝您指出問題。由於我們需要控制源,我們需要找出解決方案。 – Gary

0

我還沒有使用它,但HttpModule類可能給你一個方法讓IIS靜態服務您的文件,同時給你訪問的編程控制對這些文件:

public class AccessControlModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.BeginRequest += 
      (s, e) => 
      { 
       if (!AccessPermitted(context)) 
        context.Response.Redirect(AccessDeniedUrl); 

       // Otherwise, IIS will serve the file as normal 
      }; 
    } 

    //... 
} 

<httpModules> 
    <add name="AccessControlModule" type="MyNamespace.AccessControlModule" /> 
</httpModules> 

有些樣品見here