【问题标题】:Migrated Web Forms Application .NET 2.0 -> 3.5, new infrastructure - Images Not Caching in IE 6迁移的 Web 窗体应用程序 .NET 2.0 -> 3.5,新基础架构 - IE 6 中未缓存的图像
【发布时间】:2011-07-25 01:38:24
【问题描述】:

我一直在迁移 .NET 2.0 Web 表单应用程序以使用 .NET 3.5 和新的基础架构。 UpdatePanel 中有一个 GridView,其中包含一个 Actions 列,其中包含为该行执行操作的图标。我在 IE 6 中遇到的一个问题是图像没有缓存。这在 Actions 列上尤为明显,因为要加载 9 个图标 x 100 行 = 900 个图标。 Internet Explorer 从 900 张开始对这些图像进行倒计时,直到它们全部加载完毕。

这个问题似乎并不局限于 UpdatePanel 内的 GridView 内的图像,因为我可以看到每次刷新页面时都会重新加载标题图像。

我已经完成了我的研究:

  • Anyone have ideas for solving the "n items remaining" problem on Internet Explorer? - 这是一个不同的问题。
  • Dear IE6: Please Cache my Images. - 我确实认为这会解决所有问题,但没有。我尝试将图像设置为 div 内的背景图像,但没有成功。我还尝试将所有图标放在用户控件中,并在加载 GridView 之前将其包含在内。
  • 我有一个旧的基础架构(不存在此问题)来比较 IIS 配置,它们完全相同。
  • 使用 Fiddler,我可以沮丧地看到每个请求的图像。缓存头是Cache-Control: private。刚刚注意到此缓存标头中的Date: Tue, 29 Mar 2011 07:35:53 GMT(一小时前)。跟这有关系吗?
  • 此缓存问题似乎是间歇性的。我将第一次加载页面,不会缓存任何图像,因此将独立加载约 1000 张图像。我可能会刷新页面并缓存图像。如果我删除所有临时文件/离线内容,则图像将再次独立加载。
  • 起初我以为这只发生在将应用程序部署到新基础架构时(请求是跨林发出的),但当所有图像都是本地的时,它也确实发生在我的本地计算机上。
  • 这只是 IE 6 的问题!!!

如果我可以提供其他信息,请告诉我。

更新 1

已经尝试过但没有成功的解决方法:

  • @Afshin Gh 提出的处理程序解决方案。 UPDATE 2 答案中的代码确实有效。之前必须尝试过不同的版本。
  • @Blue Steel 提出的隐藏图像解决方案。

更新 2

其他一些解决方案可能在这里有效,但我使用了@Afshin Gh 提供的代码。

【问题讨论】:

    标签: asp.net internet-explorer-6 ajax.net image-caching


    【解决方案1】:

    使用这个处理程序:

    Public NotInheritable Class ImageHandler
        Implements IHttpHandler
    
        Private Const REQUEST_KEY As String = "pic"
    
        Public ReadOnly Property IsReusable() As Boolean Implements System.Web.IHttpHandler.IsReusable
            Get
                Return False
            End Get
        End Property
    
        Public Sub ProcessRequest(ByVal context As System.Web.HttpContext) Implements System.Web.IHttpHandler.ProcessRequest
            If Not String.IsNullOrEmpty(context.Request.QueryString(REQUEST_KEY)) Then
                Dim fileName As String = context.Request.QueryString(REQUEST_KEY)
    
                Try
    
                    Dim fileInfo As New IO.FileInfo(context.Server.MapPath(fileName))
    
                    If fileInfo.Exists Then
                        context.Response.Cache.SetCacheability(HttpCacheability.Public)
                        context.Response.Cache.SetExpires(Date.Now.AddYears(1))
    
                        Dim fileExt As String = fileInfo.Extension.Remove(0, 1).ToUpperInvariant
    
                        If fileExt = "JPG" Then
                            context.Response.ContentType = "image/jpeg"
                        Else
                            context.Response.ContentType = "image/" & fileExt
                        End If
    
                        context.Response.TransmitFile(fileInfo.FullName)
    
                    End If
    
                Catch ex As Exception
                End Try
    
            End If
        End Sub
    
    End Class
    

    在你的 web.config 中注册它:

        <httpHandlers>
            <add verb="*" path="image.axd" type="MyApp.ImageHandler, MyApp" validate="false"/>
        </httpHandlers>
    

    像这样使用它:

    <img src="image.axd?pic=/App_Themes/Modern/Logo.jpg" />
    

    【讨论】:

    • @youwut 我在我的一个项目中使用了上面的示例,完全是因为 IE6,它可以工作!我不知道还有什么可能导致这个问题。使用提琴手可能会有所帮助。
    • @youwhut 我很高兴它有帮助。非常感谢赏金。
    【解决方案2】:

    fiddler 是否显示缓存控制:对于其他浏览器也是私有的?如果是这样,它们也不会被缓存。您是否使用自定义控件来提供网格中的图像?如果是这样,您可能没有正确处理缓存标头(包括 304 响应等)。

    【讨论】:

    • 好的,用谷歌浏览器测试了这个,我可以看到 Cache-Control: private 是一样的。所以 Chrome 正在做一些其他聪明的事情来知道这些是相同的图像?图片是从帮助类加载的。
    • 确保在你的帮助类中你在你的响应中设置了缓存头。例如。 TimeSpan expirylength = new TimeSpan(0, 1, 0, 0); Response.Cache.SetCacheability(HttpCacheability.Public); Response.Cache.SetMaxAge(expirylength);Response.Cache.SetExpires(DateTime.Now.Add(expirylength));
    • 如果你真的想获得技术,我推荐这篇文章:edn.embarcadero.com/article/38123
    【解决方案3】:

    我建议在 header 上设置这个缓存参数。

    Response.Cache.AppendCacheExtension("post-check=900, pre-check=3600");
    

    您可以在此处阅读更多信息 http://www.rdlt.com/cache-control-post-check-pre-check.html 或 google。

    检查一下并告诉我这是否能解决您的问题。

    【讨论】:

      【解决方案4】:

      您是否尝试将 9 张图片添加到页面顶部(在更新面板之外)但设置为隐藏?

      <asp:Image ID="Image1" ImageUrl = "images/img1.jpg" runat="server" style = "visibility:hidden" />
      <asp:Image ID="Image2" ImageUrl = "images/img2.jpg" runat="server" style = "visibility:hidden" />
      <asp:Image ID="Image3" ImageUrl = "images/img3.jpg" runat="server" style = "visibility:hidden" />
      ...
      <asp:Image ID="Image9" ImageUrl = "images/img9.jpg" runat="server" style = "visibility:hidden" /> 
      

      【讨论】:

      • 尝试将它们添加到 DIV 中,它会起作用的!当您请求页面时,IE6 将加载它们一次(当前会话一次)。不如使用处理程序好,而是一个简单的解决方案。通过使用处理程序,您可以更有效地对其进行缓存,并且可以定义过期时间。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      • 2018-07-04
      • 1970-01-01
      • 2011-09-08
      • 2011-11-13
      • 2010-12-13
      相关资源
      最近更新 更多