1

提前为这个冗长的问题道歉。

我真的是一名数据库程序员,但继承了对最近从 IIS 5 迁移到运行 IIS 6 的新服务器的经典 ASP Intranet 应用程序的支持。用户群大约有十几个,全部使用 IE 6。

UI 显示从数据库返回的项目的层次结构,使用 HTML 无序列表和 javascript 的组合在用户导航时隐藏/展开分支。

图像显示在具有 CSS 的列表成员旁边(使用 list-style-image),每种类型的项目使用不同的图像。层次结构中不同项目类型(以及图像)的数量在 2 到 10 之间变化。层次结构在 20 到 200 之间变化。

问题:

自从迁移到 IIS 6 以来,一些用户遇到了一个问题,这似乎是由于图像未能正确应用于层次结构中的一个或多个项目引起的;列表显示正确,但缺少一张或多张图片,单击任何链接会导致加载空白页面。

使用 Wireshark 和 IIS 日志分析网络流量表明问题不在服务器端 - 所有内容都已正确提供给客户端。

该问题似乎与客户端的内容缓存有关:它似乎更经常影响以前未在当前 PC 上使用过该应用程序或一段时间未使用过该应用程序的用户。此外,我可以通过启动会话、清除浏览器缓存然后刷新页面来复制大约三分之一的问题。但是,在 IIS 5 上运行的应用程序也是如此,因此在迁移到 IIS 6 之前可能已经存在此问题,但发生频率较低。有时,如果我离开会话 20 分钟左右,浏览器似乎会“找到”丢失的图像,并且一切正常。

如果通过本地代理(我使用 Fiddler)访问应用程序,则问题永远不会发生,尽管 Fiddler 连接日志显示与服务器建立的一个或多个连接以检索图像已中止。和以前一样,网络流量显示图像是由服务器返回的。但是,使用代理似乎使 IE 能够从缓存中找到其他成功检索到的图像副本。

我已经到了我对调试 ASP/IIS 问题的有限知识的尽头。从 CSS 中删除 list-style-images 可以解决问题,但这必须是最后的选择,因为它会使应用程序更难使用。

任何关于我如何进行的建议将不胜感激。

编辑

AnonJr 建议这一定是客户端配置问题,因为所有其他组件似乎都在正常运行。

我忽略了一个简单的客户端配置问题,因为这是唯一受所描述问题影响的应用程序我已经测试了工具 > Internet 选项 > 临时文件 > 设置下的所有选项,但行为没有变化。

我应该考虑哪些其他客户端配置选项?

编辑 2 - 一个解决方案

当从客户端脚本生成 HTML 时,接受的答案提示我搜索 IE6 请求多个图像副本的已知问题 - http://support.microsoft.com/default.aspx?scid=kb;en-us; 319546

该文章(已声明此行为是“设计使然”)建议通过将所需图像加载到不可见的 DIV 中来预缓存所需图像的解决方法:

<DIV style='display:none'><IMG SRC='image.gif'></DIV>

这似乎对我有用 - 我无法再通过在会话中间清除浏览器缓存来复制问题,并且 Fiddler 跟踪显示每个图像仅被请求一次。

我确实发现了一个我以前不知道的警告;IE 缓存区分大小写,因此仅当不可见 DIV 中指定的文件名的大小写与页面中其他地方使用的大小写匹配时才会使用缓存的图像。

4

2 回答 2

1

这有点 IE6 错误的味道,即浏览器对同一资源发出多个请求。例如,如果内容要求在列表中显示重复 20 次的小图标,则它不会仅获取该图像一次,而是尝试获取 20 次。OK 19 的响应是 304 Not Modified 但这仍然是到服务器的 19 次额外往返。

我过去发现这种过度请求最终会导致太多未完成的请求。那时,对服务器的进一步请求,即使是其他页面也很难得到响应,至少在一段时间内是这样。

我不确定这是否是您的情况,检查此问题的一种方法是使用 IE7 来查看您是否遇到相同的问题,此错误已在 IE7 中修复。

编辑:现在问题已确认是我所指的错误,您还应该注意 KB 对“短时间延迟”的引用。潜在的问题是,为了重新使用新获取的图像,浏览器需要执行推迟到当前 javascript 块完成之前的工作。不仅需要“短时间延迟”,还需要异步方法。

我已经使用 display:none DIV 方法来预取图像,这适用于 AJAX 风格的工作。但是,如果您在窗口的 onload 事件期间或之前运行代码,则在此代码中添加图像时仍然会遇到问题。为了在 onload 事件完成后运行进一步的代码,需要一个 setTimeout。

于 2008-11-25T22:11:05.733 回答
0

您可能希望将注意力集中在调整客户端的缓存设置上。如果图像是由服务器发送的,则不太可能是 IIS 问题。如果将图像的 HTML 发送到浏览器,则它不是 ASP 问题。这离开了客户。

代理可能正在缓解一些问题,和/或它可能是 IE6 决定缓存图像等的一个因素。

于 2008-11-21T22:20:36.277 回答