我使用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请求组合到单个请求中的文章,使用图像映射(带偏移的单个组合图像)等,但似乎没有一个适合我的特定场景?
非常有责任!
答案 0 :(得分:5)
在重复请求中减少服务器上的优先权的一种方法是使用页面缓存能力。
在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参数),但这当然只会对同一图像的重复请求有所帮助,而不是第一个请求,因此它取决于实际问题的位置。 / p>
在不了解您的应用程序的情况下,听起来您必须更改几项以找到更好的解决方案......
答案 1 :(得分:2)
这听起来不像处理图像的好方法。在第一种情况下,您应该通过将图像作为真实图像放在服务器上而不是通过ASP页面获取它们来为您的服务器节省一些痛苦。
然后将内容过期设置为将来的某个阶段。这至少会使后续请求变得更简单。
我也会尝试使图像合理化。即使您有三个树视图,也可以找到许多常见元素。
最后,尽管需要一些工作才能实现,但是你可以将图像服务器端组合在一起,这样你只需要为树返回一个图像,我会确保你将结果缓存到某个地方,因为它会加载在服务器上生成。
答案 2 :(得分:1)
您可以尝试增加asp.net配置文件中的工作线程数。
更多信息可以在这里找到:
http://williablog.net/williablog/post/2008/12/02/Increase-ASPNET-Scalability-Instantly.aspx
http://msdn.microsoft.com/en-us/library/ms187024.aspx
我还要补充一点,HTTP标准将单个服务器的同步连接数限制为每个客户端只有2个连接。 IE肯定会强制执行此限制,但Firefox我相信自己限制为4.这些限制是客户端可配置的我害怕(你无法从服务器端更改它们)。