6

我使用 .ashx 处理程序从数据库中获取图像。我想以这种方式检索大量图像(> 1000):

    <img src='GetImage.ashx?id= <%# Eval("id") %>'/>

(为什么我这样做你可以理解,如果阅读我之前的问题:bind database image to ItemTemplate in .ascx)。我担心多重数据库查询(第一个查询获取所有id,所有其他查询一个一个获取图像)将采取很多时间,是吗?有哪些可能的解决方案?

4

2 回答 2

3

首先,浏览器并没有一起询问图像,而是一次询问几个。

其次,处理程序不使用会话,因此它不会锁定另一个,因此可以为图像调用完成并行处理。

我建议为浏览器添加缓存的额外内容,因此当它加载图像时不再询问它。

一个例子:

context.Response.Cache.SetExpires(DateTime.Now.AddMinutes(120));
context.Response.Cache.SetMaxAge(new TimeSpan(0, 120, 0));

但您可以添加更积极的缓存。

一个类似的问题:调用aspx页面以随机缓慢返回图像

于 2012-10-25T11:26:27.790 回答
3

对于经常要求的静态内容,缓存始终是一个好主意。

此外,如果图像相对较小,您可以使用数据 uri 的http://css-tricks.com/data-uris/

假设您有一个带有 ID INT、名称 VARCHAR(64)、MimeType VARCHAR(64) 和数据 VARBINARY(MAX) 的图像表

SELECT Name, 'data:' + MimeType + ';base64,' + cast(N'' as xml).value('xs:base64Binary(xs:hexBinary(sql:column("Data")))', 'VARCHAR(MAX)') AS DataURI

<img src='<%# Eval("DataURI") %>' alt='<%# Eval("Name") %> />

通过这种方式,您可以拥有 1 个将返回所有内容的数据库查询。

于 2012-10-25T11:42:17.390 回答