Application de formulaires Web migrés .NET 2.0 -> 3,5, nouvelle infrastructure - Images pas en cache dans IE 6

StackOverflow https://stackoverflow.com/questions/5469313

Question

J'ai migré une application .NET 2.0 Web Forms pour utiliser .NET 3.5 et une nouvelle infrastructure. Il y a un GridView à l'intérieur d'un UpdatePanel, avec une colonne d'action qui contient des icônes pour effectuer une action pour cette ligne. Un problème que j'ai dans IE 6 est que les images ne cachent pas. Ceci est particulièrement visible sur la colonne Actions car il y a 9 icônes x 100 lignes = 900 icônes à charger. Internet Explorer compte ces images de 900 jusqu'à ce qu'ils soient tous chargés.

Ce problème ne semble pas être limité aux images à l'intérieur du GridView qui se trouve à l'intérieur d'un UpdatePanel car je peux voir des images d'en-tête recharger chaque fois qu'il y a un rafraîchissement de page.

J'ai fait ma recherche:

  • Quelqu'un a-t-il des idées pour résoudre le problème des «éléments n restants» sur Internet Explorer? - C'est un problème différent.
  • Cher IE6: Veuillez mettre mes images. - Je pensais que cela résoudrait tous les problèmes, mais non. J'ai essayé de définir l'image en tant qu'image d'arrière-plan à l'intérieur d'une div mais pas de succès. J'ai également essayé de mettre toutes les icônes dans un contrôle utilisateur et l'inclure avant que le GridView ne soit chargé.
  • J'ai une ancienne infrastructure (où ce problème n'existait pas) pour comparer les configurations IIS et elles sont exactement les mêmes.
  • En utilisant Fiddler, je peux voir frustrant chaque image demandée. L'en-tête de cache est Cache-Control: private. Juste remarqué Date: Tue, 29 Mar 2011 07:35:53 GMT (ce qui est il y a une heure) dans cet en-tête de cache. Cela a-t-il quelque chose à voir avec cela?
  • Ce problème de mise en cache semble être intermittent. Je chargerai la page pour la première fois et aucune image ne sera mise en cache, donc ~ 1000 images seront chargées indépendamment. Je peux actualiser la page et les images seront mises en cache. Si je supprime tous les fichiers temporaires / contenu hors ligne, les images seront à nouveau chargées indépendamment.
  • Au début, je pensais que cela ne s'était produit que lors du déploiement de l'application dans la nouvelle infrastructure (les demandes sont faites de manière croisée), mais cela se produit également sur ma machine locale lorsque toutes les images sont locales.
  • Ce n'est qu'un problème dans IE 6 !!!

Veuillez me faire savoir si je peux fournir d'autres informations.

Mise à jour 1

Solutions de contournement qui ont déjà été tentées sans succès:

  • La solution de gestionnaire proposée par @afshin gh. MISE À JOUR 2 Le code de la réponse fonctionne réellement. Une version différente doit avoir été tentée précédemment.
  • La solution d'images cachées proposée par @Blue Steel.

MISE À JOUR 2

Certaines des autres solutions ont peut-être fonctionné ici, mais je suis allé avec le code fourni par @afshin gh.

Était-ce utile?

La solution

Utilisez ce gestionnaire:

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

Inscrivez-le dans votre web.config:

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

Utilisez-le comme ceci:

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

Autres conseils

Fiddler montre-t-il également le contrôle du cache: privé pour les autres navigateurs? Si c'est le cas, ils ne seront pas mis en cache non plus. Utilisez-vous un contrôle personnalisé pour servir les images de la grille? Si c'est le cas, vous ne gérez probablement pas correctement les en-têtes de cache (y compris 304 réponses, etc.).

Je suggère de définir ces paramètres de cache sur l'en-tête.

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

Vous pouvez en savoir plus ici http://www.rdlt.com/cache-control-post-check-pre-check.html ou google.

Vérifiez-le et dites-moi si cela résout votre problème.

Avez-vous essayé d'ajouter les 9 images en haut de votre page (en dehors du panneau de mise à jour) mais que vous êtes défini sur Hidden?

<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" /> 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top