Application de formulaires Web migrés .NET 2.0 -> 3,5, nouvelle infrastructure - Images pas en cache dans IE 6
-
14-11-2019 - |
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.
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" />