在ASP.NET MVC 5中从SQL Server检索图像(以字节[]存储)的速度非常慢
本文关键字:存储 字节 非常 速度 MVC NET ASP 中从 SQL 图像 检索 | 更新日期: 2023-09-27 17:58:33
我将图像存储在bytes[]
中的SQL Server中,然后使用VIEWDATA进行检索,如下所示(我正在检索的数据库中有九个图像(bytes[]
)):
动作控制器:
public ActionResult show_pics2()
{
using (cygnussolutionEntities6 db = new cygnussolutionEntities6())
{
// db.CommandTimeout = int.MaxValue; //For test
var querylist = (from f in db.Images
select f.ImageContent);
// get list in ViewBag
ViewBag.DataLIst = querylist;
// get list in View Data
ViewData["images"] = querylist.ToList();
return View();
}
}
在视图中,我正在解析图像,并使用foreach循环和viewDATA
显示它,但加载到浏览器需要很长时间。有人知道为什么要花这么长时间吗?
值得在代码中设置一些计时器,以查看缓慢发生的地方——即,是对数据库的查询缓慢,是将结果具体化为列表缓慢,还是处理图像时视图中发生的缓慢。
同样值得考虑的是,您是否渴望从Images表中加载任何属性,因为这将影响性能,具体取决于加载的额外导航属性的数量。
您是否能够在视图和实体类中发布代码?
-
如果您要使用
ToList()
,并且也要在其他地方使用它,那么使两者都使用ToList()
的结果(除非您真的需要维护可查询接口)。那么你只需要得到一次清单。 -
不要获取多个Blob并在一个页面上使用它们,获取多个ID并使用它们通过
<img src="theImage/@id">
或类似方式调用其他资源,然后让只检索唯一图像的视图为该资源提供服务。然后,每个这样的资源加载单个图像,并且可以彼此并行地这样做。 -
除非图像都很小,否则使用基于ADO访问blob的流,并一次流式输出4096字节的块,而不是EF。虽然这意味着要留下EF给你的很多东西(以及MVC给你的许多东西,因为你必须在结果而不是视图中完成),但它允许从第一个加载的块开始的高效内存流。