HTTP处理程序对于图像数组效率低下

本文关键字:数组 效率 图像 程序 处理 于图像 HTTP | 更新日期: 2023-09-27 18:13:18

我有一个HTTP处理程序,返回从数据库中存储为VARBINARY(MAX)的图像。Repeater中的ImageURL属性设置为:

ImageUrl='<%# "~/ImageHandler.ashx?PictureId=" + Container.DataItem.ToString() %>' 

它的工作原理。然而,这段代码的真正问题是该页的Page_Load方法从数据库返回"PictureId"列表,然后返回"ImageHandler"。Ashx '为每个图像对数据库进行单独的、单独的调用。到数据库的往返次数太多了。

我正在寻找一种方法来获得所有的图像在一个镜头,并在Repeater显示它们。将图像转换为Base64似乎是一个可行的选择,直到我意识到没有可用的缓存。我还能怎么做呢?我很好与HTTP处理程序做的工作,但它必须在一个镜头。什么好主意吗?

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处理程序获得所有的图像在一次命中基于一个PictureId。

编辑->

除了你的缓存问题,事实是,没有图像(浏览器的HTTP资源)物理存在于你的服务器缓存不能被web浏览器服务。你能做的是1)使用客户端脚本通过构建API从服务器调用图像2)或者使用Base64转换,因为没有其他选择,尽管它会增加带宽利用率

你基本上把两个不同的问题合二为一了。因为为多个请求克服HTTP Handler是一种情况,而提供缓存是另一种情况。 你应该有http资源(图像文件)存在你的web服务器上,我说过,但如果你关心的性能,然后替代缓存,你可以压缩你的图像使用一些压缩机制,这将节省一些带宽和加载时间,你的页面。这里有一本好书。如果这仍然没有帮助,请评论或标记为答案。