代码之家  ›  专栏  ›  技术社区  ›  Ed Harper

经典的ASP-IIS 5到IIS 6迁移会导致图像缓存问题吗?

  •  1
  • Ed Harper  · 技术社区  · 17 年前

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

    我实际上是一名数据库程序员,但继承了对经典ASP内联网应用程序的支持,该应用程序最近已从IIS 5迁移到运行IIS 6的新服务器。用户群大约有十几个,都使用IE 6。

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

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

    问题:

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

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

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

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

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

    如有任何关于我如何继续的建议,我们将不胜感激。

    编辑

    AnonJr认为这一定是客户端配置问题,因为所有其他组件似乎都正常工作。

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

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

    编辑2-解决方案

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

    这篇文章(指出这种行为是“设计的”)建议通过将所需图像加载到不可见的DIV中来预缓存它们:

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

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

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

    2 回复  |  直到 14 年前
        1
  •  1
  •   AnthonyWJones    17 年前

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

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

    我不确定这是否是你的情况,一种检查方法是使用IE7,看看你是否遇到了同样的问题,这个bug在IE7中得到了修复。

    编辑 :既然问题被证实是我提到的bug,你也应该注意知识库中提到的“短时间延迟”。潜在的问题是,为了重用新获取的图像,浏览器需要做一些推迟到当前javascript块完成的工作。需要的不仅仅是“短时间延迟”,还需要异步方法。

    我使用了display:none-DIV方法来预取图像,这对于AJAX风格的工作很有效。但是,如果你在窗口的onload事件期间或之前运行代码,那么在这段代码中添加图像时仍然会遇到问题。需要一个setTimeout,以便在onload事件完成后运行更多代码。

        2
  •  0
  •   AnonJr    17 年前

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

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

    推荐文章