2

我使用 HttpHandler 在 ASP.Net Web 应用程序中动态提供图像。我遇到了性能问题(Firfox/Firebug/YSlow 报告 HttpRequest 太多)

在某些情况下,我每页有 50-100 张图像。3 个树视图(业务单位/类别/对象),每个节点都有自己的图像;)

每个项目的图像 url 都是这样动态设置的......

SomeImage.ImageUrl = "/image.axd?ImageId={0}";

注意:我只知道在运行时需要哪些图像。

附加:图像位于服务器文件系统、资源文件和数据库中 - 用户可以上传自己的图像以与我的系统对象相关联,ImageHandler 将动态确定每个图像位置)

在 web.config 中,httphandler 已配置并按预期工作...添加 verb="GET" path="image.axd" type="Vision.OnsightManager.ImageHandler"

在 HttpHandler 中,原始图像字节被返回以响应每个图像请求。所以在图像处理程序的 WriteResponse() 方法中,图像字节被返回,就像这样......

context.Response.BinaryWrite(字节);

所有图像都正确显示,但应用程序在显示许多图像时出现预期的性能问题......

问题:

除了减少图像数量 ;) 之外,您还推荐什么方法来最小化为每个图像生成的所有 HttpRequest?也许组合成一个 Http 请求?

我已经阅读了关于将多个 css 请求组合成一个请求、使用图像映射(带有偏移的单个组合图像)等的文章,但似乎没有一个适合我的特定场景?

非常感谢!

4

3 回答 3

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 参数),但这当然只会有助于对同一图像的重复请求,而不是第一个,因此这取决于实际问题出在哪里。

在不太了解您的应用程序的情况下,听起来您必须更改几件事才能找到更好的解决方案...

于 2009-01-28T09:24:59.607 回答
2

这听起来不是处理图像的好方法。在第一种情况下,您应该通过将图像作为真实图像放在服务器上而不是通过 ASP 页面获取它们来为您的服务器节省一些痛苦。

然后,您将内容到期时间设置为将来的某个阶段。这至少会使后续请求更简单。

我也会尝试对图像进行一些合理化。即使您有三个树视图,您也可能会找到许多共同的元素。

最后,虽然这需要一些工作来实现,但您可以组合图像服务器端,因此您只返回一个图像的树,如果您这样做,我会确保您将结果缓存在某处,因为它会将负载放在服务器上在它生成的同时。

于 2009-01-28T08:59:36.427 回答
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。恐怕这些限制是客户端可配置的(您无法从服务器端更改它们)。

于 2009-01-28T09:00:15.130 回答