2009-01-28 30 views
2

我使用HttpHandler在ASP.Net Web應用程序中動態地提供圖像。 我有一個性能問題(Firfox /螢火蟲/ YSlow的報道有太多HTTPRequests的)ASP.Net - 多個動態圖像。由於太多的Http請求導致的性能問題

我有每頁50-100圖像在某些情況下。3個樹視圖(企業單位/分類/對象),每間具有其自身的圖像節點;)

每個項目的圖像的URL被動態地設置像這樣...

SomeImage.ImageUrl = 「/image.axd?ImageId={0}」;

注:我只知道在運行時需要哪些圖像。

附加:圖像所在的服務器文件系統上,在一個資源文件,並在數據庫中 - 用戶可以上傳自己的圖片與我的系統對象相關聯和ImageHandler將動態地確定每個圖像位置)

在web.config的HttpHandler的構造和如預期工作... 添加動詞=「GET」路徑=「image.axd」類型=「Vision.OnsightManager.ImageHandler」

在HttpHandler的原始圖像響應每個圖像請求返回字節。 因此,在圖像處理程序的WriteResponse()方法中返回圖像字節,就像這樣...

context.Response.BinaryWrite(bytes);

所有圖像正常顯示,但應用程序有性能問題,如預期,其中顯示許多圖像...

問:

你推薦什麼辦法,除了減少圖像數),用於最小化爲每個圖像生成的所有HttpRequests?也許組合成一個Http請求?

我已經閱讀了關於將多個css請求合併爲一個請求,使用圖像映射(帶有偏移量的單個合併圖像)等的文章,但沒有一篇似乎適合我的特定場景?

非常感謝!

+0

我建議雙方[磁盤緩存(http://imageresizing.net)和發送客戶端緩存標題,以便重複請求不必擊中服務器。這聽起來像是一個商業應用程序,大多數用戶多次訪問它,緩存可能會修復請求數。 – 2012-01-09 21:25:54

回答

5

減少服務器重複請求的寶貴之處的一種方法是使用頁面緩存能力。

中的HttpHandler的Response.Write之前補充一點:

// Set for how long you want the image to be cached. 
context.Response.Cache.SetExpires(DateTime.Now.AddDays(1)); 
context.Response.Cache.SetCacheability(HttpCacheability.Public); 
context.Response.Cache.SetValidUntilExpires(true); 
context.Response.Cache.VaryByParams["ImageId"] = true; 

這將使服務器緩存的結果(根據圖像標識PARAM),但是這當然只對同一再三請求幫助形象,而不是第一個,所以它取決於實際問題在哪裏。

不知道很多關於你的應用程序,它聽起來就像你必須改變一些東西,找到一個更好的解決辦法...

+0

哇。感謝所有偉大的迴應。 有什麼辦法可以滿足第一個要求?客戶端高速緩存方法僅在初始請求後纔會啓動,這將會使用緩慢的預客戶端高速緩存? – Konrad 2009-01-28 09:57:58

2

這聽起來不像是處理圖像的好方法。在第一種情況下,您應該通過將圖像作爲真實圖像放在服務器上而不是通過ASP頁面獲取它們來節省服務器的一些痛苦。

然後您將內容過期設置爲將來的某個階段。這至少會使後續請求更簡單。

我也試着合理化一些圖像。即使你有三個樹視圖,你也可以找到很多共同的元素。

最後,雖然需要一些工作來實現,但您可以組合圖像服務器端,因此您只能爲樹返回一個圖像,如果您這樣做,我會確保將結果緩存在某處在生成時加載到服務器上。

1

您可以嘗試增加asp.net配置文件中工作線程的數量。

更多信息可以在這裏找到:
http://williablog.net/williablog/post/2008/12/02/Increase-ASPNET-Scalability-Instantly.aspx http://msdn.microsoft.com/en-us/library/ms187024.aspx

我也將添加HTTP標準限制的同時連線的數量在一臺服務器每個客戶端僅僅2個連接。 IE當然強制執行這個限制,但是我相信Firefox本身限制爲4.這些限制是客戶端可配置的,我擔心(你不能從服務器端改變它們)。

相關問題