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

我真的是一名数据库程序员,但继承了对经典ASP内联网应用程序的支持,该应用程序最近已从IIS 5迁移到运行IIS 6的新服务器。用户群大约有十几个,全部使用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中删除列表样式图像可以解决问题,但这必须是最后的选择,因为它会使应用程序更难以使用。

我将非常感激地收到有关如何进行的任何建议。

修改

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

我打了一个简单的客户端配置问题,因为这是受所述问题影响的唯一应用程序 我已经测试了Tools <!> gt;下的所有选项;互联网选项<!> gt;临时文件<!> gt;设置没有改变行为。

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

编辑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中指定的文件名大小写与页面中其他位置使用的大小写匹配时,才会使用缓存图像。

有帮助吗?

解决方案

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

我过去发现这种过度请求最终会导致太多未完成的请求。此时,对服务器的进一步请求,即使其他页面也难以获得响应,至少暂时如此。

我不确定这是你的情况发生了什么,检查这个问题的一种方法是使用IE7来查看你是否遇到了同样的问题,IE7中修复了这个错误。

编辑:既然问题确认是我提到的错误,您还应该注意KB引用的“短时间延迟”。根本问题在于,为了重新使用新获取的图像,浏览器需要完成所需的工作,直到当前的javascript块完成为止。不仅需要“短时间延迟”,还需要异步方法。

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

其他提示

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top