[英]HTTP Handler Inefficient for an array of images
我有一個HTTP處理程序,它從數據庫返回存儲為VARBINARY(MAX)
圖像。 Repeater
的ImageURL
屬性設置為:
ImageUrl='<%# "~/ImageHandler.ashx?PictureId=" + Container.DataItem.ToString() %>'
有用。 但是,此代碼的真正問題是頁面的Page_Load
方法從數據庫返回“ PictureId”的列表,然后“ ImageHandler.ashx”對每個圖像分別進行單獨的數據庫調用 。 到數據庫的往返太多了。
我正在尋找一種方法來一次獲取所有圖像並將其顯示在Repeater
。 直到我意識到沒有可用的緩存,將圖像轉換為Base64似乎是一個可行的選擇。 我還能怎么做? 我對HTTP處理程序的工作很滿意,但是必須一槍而行。 有任何想法嗎?
好吧,您正在使用的方法將為每個單獨的調用提供相同的結果,就像您使用PictureId獲取數據庫中的每個唯一圖像一樣。
方法1。
為了解決您所關心的問題,您首先要做的是打數據庫,並從數據庫中獲取所有圖像並保存在通用列表中。 現在,從該通用列表解析圖像並將其提供給中繼器。
方法2。 我沒有嘗試遵循以下代碼,但我希望它可以使您了解如何獲得所需的代碼。
要使圖像在中繼器控制中無效:
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ConnectionStrings:ConnectionString %>" SelectCommand="SELECT Image FROM Images">
</asp:SqlDataSource>
<asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource1" OnItemDataBound="Repeater1_ItemDataBound">
<itemtemplate>
<asp:HiddenField Value='<%# Eval("id") %>' ID="HiddenField1" runat="server" />
<asp:Image ID="Image1" runat="server" />
</itemtemplate>
</asp:Repeater>
並在aspx.cs中
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
HiddenField hf = e.Item.FindControl("HiddenField1") as HiddenField;
if (hf != null)
{
string val = hf.Value;
Image img = e.Item.FindControl("Image1") as Image;
img.ImageUrl = string.Format("data:image/jpg;base64,{0}",val);
}
}
注意:您不能使用HTTP Handler一次基於PictureId獲取所有圖像。
編輯->
除了您的緩存問題外,事實是,如果沒有圖像(對於瀏覽器為HTTP資源)實際存在於您的服務器緩存中,則Web瀏覽器將無法提供該圖像。 您可以做的是1)使用客戶端腳本通過構建API從服務器調用圖像2)或進行Base64轉換,因為它沒有其他選擇,盡管它將增加帶寬利用率
您基本上將兩個不同的問題合而為一。 因為克服多個請求的HTTP處理程序是一種情況,而提供緩存則是另一種情況。
對於Web瀏覽器緩存功能,如我所說,您應該在Web服務器上存在http資源(圖像文件),但是如果您擔心性能,然后選擇緩存,則可以使用某種壓縮機制來壓縮圖像,這樣可以節省一些帶寬和頁面的加載時間。 這里有一個很好的讀取 。 如果仍然無法解決問題,請發表評論或將其標記為答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.