我使用HttpHandler在ASP.Net Web应用程序中动态提供图像.我遇到了性能问题(Firfox/Firebug/YSlow报告有太多的HttpRequests)
在某些情况下,我每页有50-100个图像.3个树视图(业务单元/类别/对象),每个节点都有自己的图像;)
每个项目的图片网址都是动态设置的......
SomeImage.ImageUrl ="/ image.axd?ImageId = {0}";
注意:我只在运行时知道需要哪些图像.
附加:图像位于服务器文件系统,资源文件和数据库中 - 用户可以上传自己的图像以与我的系统对象关联,ImageHandler将动态确定每个图像位置)
在web.config中,httphandler已配置并按预期工作... add verb ="GET"path ="image.axd"type ="Vision.OnsightManager.ImageHandler"
在HttpHandler中,返回原始图像字节以响应每个图像请求.所以在图像处理程序的WriteResponse()方法中返回图像字节,就像这样......
context.Response.BinaryWrite(字节);
所有图像都能正确显示,但应用程序出现了预期的性能问题,其中显示了许多图像...
题:
除了减少图像数量之外,您还建议使用哪种方法;),以最大限度地减少为每个图像生成的所有HttpRequests?也许组合成一个Http请求?
我已经阅读了关于将多个css请求组合到单个请求中的文章,使用图像映射(带有偏移的单个组合图像)等,但似乎没有一个适合我的特定场景?
非常感谢!
在重复请求时减少服务器上的优先权的一种方法是使用页面可缓存性.
在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;
这将使服务器缓存结果(取决于ImageId参数),但这当然只会对同一图像的重复请求有所帮助,而不是第一个请求,因此它取决于实际问题的位置.
在不了解您的应用程序的情况下,听起来您必须更改一些内容才能找到更好的解决方案......