Impossible d’afficher le PDF à partir de HTTPS dans IE 8 (sur Vista 64 bits)

J’ai un serveur HTTPS développé sur place qui sert des fichiers simples (intégrés dans mon application). Cela fonctionne très bien – je l’utilise depuis toujours.

Prise en charge récente du protocole SSL – Chrome, FireFox et IE le préfèrent et chargent les pages correctement.

Le problème que je trouve est lorsque j’essaie de charger un fichier PDF sur la connexion HTTPS. Pour une raison quelconque, le PDF ne s’affiche jamais dans IE 8 (64 bits sous Vista 64 bits). Cela fonctionne très bien dans Chrome. Et cela fonctionne très bien dans IE 8 en utilisant HTTP simple – échoue seulement en utilisant HTTPS.

REMARQUE: Lorsque IE 8 est mentionné, il s’agit d’IE 8 32 bits sur Vista 64 bits, bien que le IE 8 bits ait le même comportement.

Cela me fait penser à une sorte de problème de système d’exploitation IE 8 / HTTPS / PDF / 64-bit, mais je ne suis pas sûr.

DebugBar pour IE 8 montre que la demande et la réponse ont été exactement comme prévu – aucune erreur du tout. IE 8 ne montre aucune erreur ou quoi que ce soit – écran blanc pur (ou la page qui était affichée avant que je tente de charger le PDF). Cache effacé / cookies / etc.

Existe-t-il des problèmes connus avec IE / PDF / HTTPS?

Je pensais revenir et donner la réponse finale.

Merci à tous ceux qui ont suggéré “Ne pas enregistrer les pages cryptées sur le disque”.

J’ai suivi les conseils d’EricLaw et établi:

Cache-Control: private 

J’ai également constaté que j’avais Pragma: no-cache , que j’ai supprimé.

Ça fonctionne parfaitement maintenant 🙂

J’ai rencontré ce même problème et je ne pouvais le faire fonctionner qu’en demandant à l’utilisateur de modifier ses parameters de sécurité pour désactiver l’option Ne pas enregistrer les pages chiffrées sur le disque dans l’onglet Avancé de la boîte de dialog Options Internet: http://support.microsoft .com / kb / 812935

… puis avec la panique immédiate terminée, j’ai commencé à regarder le code (ASP.NET en utilisant VB). J’ai utilisé le fiddler et j’ai constaté que même si je ne spécifiais pas l’en-tête de contrôle du cache, il semblait que le Framework spécifiait automatiquement un no-store pour moi. La clé pour résoudre le problème était en fait dans cette question PHP . En définissant l’en-tête de contrôle du cache sur max-age = 1, le fichier serait mis en cache pendant 1 seconde, juste assez longtemps pour qu’Adobe Reader puisse le récupérer sur le disque et le charger en mémoire. J’ai mis à jour notre code pour générer le PDF comme suit:

 Response.ClearContent() Response.ClearHeaders() Response.AddHeader("cache-control", "max-age=1") Response.ContentType = "application/pdf" Response.AddHeader("content-disposition", "attachment; filename=whatever.pdf") Response.AddHeader("content-length", mem_stream.Length.ToSsortingng) Response.BinaryWrite(mem_stream.ToArray()) Response.Flush() Response.End() 

Mise à jour: Je pensais que cela fonctionnait, mais je suppose que j’ai parlé trop tôt. J’ai créé une nouvelle question à suivre avec ce problème.

 response.setHeader("Cache-Control","private"); 

a fait le tour pour nous dans IE8 et IE9.

Cela n’a pas nécessité de modifier les parameters dans le navigateur.

J’ai eu un problème similaire avec IE8 et https. Lorsque j’ai essayé de diffuser un pdf dans une nouvelle fenêtre, j’ai plutôt eu une page HTML vierge (cela fonctionnait dans FireFox et si ce n’était pas via https). Après avoir cherché et essayé différentes variantes des en-têtes de réponse, la solution pour moi était de définir:

Response.AppendHeader("Accept-Ranges", "none");

Cela télécharge l’intégralité du pdf avant qu’il ne s’ouvre, ce qui est moins convivial s’il s’agit d’un pdf très volumineux. Mais dans mon cas, la plupart des fichiers PDF ne contenaient que quelques pages. J’espère que cela aide quelqu’un.

Je ne vois aucune référence à .NET dans votre question, mais je vais fournir une solution connexe. J’espère que vous pourrez en tirer ce dont vous avez besoin, et les développeurs supposant que votre question concerne .NET pourraient également y trouver une valeur.

Voici une méthode que j’ai utilisée auparavant pour restituer les fichiers PDF dans le navigateur, via HTTPS, sans mise en cache.

  private void RenderPdfToResponse(byte[] documentBytes) { Response.BufferOutput = true; Response.ClearContent(); Response.ClearHeaders(); Response.AddHeader("Cache-control", "no-store"); Response.ContentType = "application/pdf"; Response.AddHeader("Content-Length", documentBytes.Length.ToSsortingng()); Response.BinaryWrite(documentBytes); Response.Flush(); HttpContext.Current.ApplicationInstance.CompleteRequest(); } 

** Un pseudo-cache se produit, juste assez longtemps pour que Adobe Reader charge le fichier PDF. J’ai cherché une référence décrivant ce dont je parle, et un thread de forum aléatoire est le meilleur que je puisse faire:

IE stocke le PDF dans la mémoire “volatile” allouée et place un pointeur dans% system% Temp. C’est le seul endroit où le fichier est stocké. Le pointeur est supprimé et la mémoire allouée est libérée dès la fermeture d’Adobe Reader.

Je ne peux pas garantir l’exactitude technique de cela, mais cela reflète ce que j’ai observé en utilisant la méthode ci-dessus. En fait, je pense que ce fichier disparaît à la fin du chargement dans Adobe Reader (dans le navigateur).

Utilisez-vous la version 32 bits ou 64 bits d’IE sous Vista 64? Il vient avec les deux. La plupart du temps, la version 32 bits est utilisée car peu de plug-ins prennent en charge 64 bits.

Je vérifierais s’il y a une différence entre les deux. Si cela fonctionne dans IE 8 32 bits sur Vista 64, cela pourrait poser problème avec la version 64 bits de Browser Helper Object (BHO).

Aussi, vérifiez pour voir (via la présence du gestionnaire de tâches «* 32» après un nom de processus) si les autres navigateurs fonctionnent en mode 32 bits.

Une autre chose que je vérifierais pour voir si HTTPS est de faire en sorte qu’IE8 ne cache pas le fichier PDF pour une raison quelconque (le trafic HTTPS n’est généralement pas mis en cache). Je lancerais procmon pour voir si un fichier PDF est écrit dans le système de fichiers. Il se peut que vous deviez modifier un paramètre de stratégie. Je ne suis pas sûr qu’il existe une autre manière de dire que vous avez un PDF qui ne devrait pas être écrit sur le disque mais pourrait quand même être affiché.

En tant qu’utilisateur, j’avais le même problème lors du chargement de fichiers pdf à partir de Schwab.com. Les conseils pour “désactiver l’option Ne pas enregistrer les pages chiffrées sur le disque dans l’onglet Avancé de la boîte de dialog Options Internet: http://support.microsoft.com/kb/812935 ” ont fonctionné pour moi.

Ma solution (cela nous a pris des jours à jouer avec les en-têtes pour que cela fonctionne):

  if (System.Web.HttpContext.Current.Request.Browser.Browser == "InternetExplorer" && System.Web.HttpContext.Current.Request.Browser.Version == "8.0") { System.Web.HttpContext.Current.Response.Clear(); System.Web.HttpContext.Current.Response.ClearContent(); System.Web.HttpContext.Current.Response.ClearHeaders(); System.Web.HttpContext.Current.Response.ContentType = "application/octet-stream"; System.Web.HttpContext.Current.Response.AppendHeader("Pragma", "public"); System.Web.HttpContext.Current.Response.AppendHeader("Cache-Control", "private, max-age=60"); System.Web.HttpContext.Current.Response.AppendHeader("Content-Transfer-Encoding", "binary"); System.Web.HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=" + document.Filename); System.Web.HttpContext.Current.Response.AddHeader("content-length", document.Data.LongLength.ToSsortingng()); System.Web.HttpContext.Current.Response.BinaryWrite(document.Data); } 

J’espère que ça aide quelqu’un