2

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

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

我做了我的研究:

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

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

更新 1

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

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

更新 2

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

4

4 回答 4

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" />
于 2011-04-07T22:21:58.257 回答
1

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

于 2011-04-08T13:35:50.853 回答
1

我建议在标头上设置此缓存参数。

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

你可以在这里阅读更多关于http://www.rdlt.com/cache-control-post-check-pre-check.html或谷歌它。

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

于 2011-04-12T12:32:34.667 回答
0

您是否尝试将 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" /> 
于 2011-04-07T21:02:27.440 回答