Приложение для миграции веб-форм .NET 2.0 -> 3.5, новая инфраструктура - изображения не кэшируются в IE 6 - PullRequest
2 голосов
/ 29 марта 2011

Я переносил приложение веб-форм .NET 2.0 для использования .NET 3.5 и новой инфраструктуры.Внутри UpdatePanel есть GridView со столбцом Actions, который содержит значки для выполнения действия для этой строки.Проблема, с которой я столкнулся в IE 6, заключается в том, что изображения не кэшируются.Это особенно заметно в столбце «Действия», поскольку для загрузки доступно 9 значков x 100 строк = 900 значков.Internet Explorer отсчитывает эти изображения с 900 до их полной загрузки.

Эта проблема, по-видимому, не ограничивается изображениями внутри GridView, который находится внутри UpdatePanel, потому что я вижу, что изображения заголовков перезагружаются каждый раз тамтакое обновление страницы.

Я провел исследование:

  • У кого-нибудь есть идеи по решению проблемы "n элементов осталось" в Internet Explorer? - этоЭто другая проблема.
  • Уважаемый IE6: Пожалуйста, кэшируйте мои изображения. - Я действительно думал, что это решит все проблемы, но нет.Я попытался установить изображение в качестве фонового изображения внутри div, но безуспешно.Я также попытался поместить все значки в пользовательский элемент управления, в том числе и до загрузки GridView.
  • У меня есть старая инфраструктура (где этой проблемы не было) для сравнения конфигураций IIS, и они абсолютно одинаковы.
  • Используя Fiddler, я могу расстроенно видеть каждое запрашиваемое изображение.Заголовок кэша Cache-Control: private.Только что заметил Date: Tue, 29 Mar 2011 07:35:53 GMT (что час назад) в этом заголовке кэша.Это как-то связано с этим?
  • Эта проблема с кешированием кажется нерегулярной.Я загружу страницу в первый раз, и никакие изображения не будут кэшированы, поэтому ~ 1000 изображений будут загружены независимо.Я могу обновить страницу, и изображения будут кэшированы.Если я удаляю все временные файлы / автономный контент, то изображения снова будут загружаться независимо.
  • Сначала я думал, что это происходит только при развертывании приложения в новой инфраструктуре (запросы выполняются между лесами), но это не так.случается и на моей локальной машине, когда все изображения локальные.
  • Это проблема только в IE 6 !!!

Пожалуйста, дайте мне знать, если яможет предоставить другую информацию.

ОБНОВЛЕНИЕ 1

Обходные пути, которые уже были предприняты безуспешно:

  • Решение обработчика, предложенное @Афшин Гх. ОБНОВЛЕНИЕ 2 Код в ответе действительно работает.Возможно, ранее была предпринята попытка использовать другую версию.
  • Решение для скрытых изображений, предложенное @Blue Steel.

ОБНОВЛЕНИЕ 2

Некоторые издругие решения, возможно, работали здесь, но я использовал код, предоставленный @Afshin Gh.

Ответы [ 4 ]

1 голос
/ 12 апреля 2011

Предлагаю установить параметры этого кэша в заголовке.

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

Подробнее об этом можно прочитать здесь http://www.rdlt.com/cache-control-post-check-pre-check.html или Google.

Проверьте это и скажите мне, если это решит вашу проблему.

1 голос
/ 08 апреля 2011

Используйте этот обработчик:

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" />
1 голос
/ 08 апреля 2011

Показывает ли fiddler управление кэшем: частное для других браузеров? Если так, то они тоже не будут кэшироваться. Используете ли вы пользовательский элемент управления для отображения изображений в сетке? Если это так, вы, вероятно, неправильно обрабатываете заголовки кэша (включая 304 ответа и т. Д.).

0 голосов
/ 08 апреля 2011

Вы пытались добавить 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" /> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...