web-dev-qa-db-fra.com

Impossible d'afficher PDF de HTTPS dans IE 8 (sur Vista 64 bits)

J'ai un serveur HTTPS local qui sert des fichiers simples (il est intégré à mon application). Cela fonctionne très bien - je l'utilise depuis toujours.

Prise en charge SSL récemment ajoutée - Chrome, FireFox et IE l’apprécient et chargent les pages sans problème.

Le problème que je trouve est lorsque je tente de charger un fichier PDF via la connexion HTTPS. Pour une raison quelconque, le PDF ne s'affiche jamais dans IE 8 (64 bits sur Vista 64 bits). Cela fonctionne très bien dans Chrome . Et dans IE 8 lorsque vous utilisez un protocole HTTP simple - échoue uniquement lorsque vous utilisez HTTPS.

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

Cela me fait penser que c'est une sorte de problème lié au système d'exploitation IE 8/HTTPS/PDF/64 bits, mais je ne suis pas sûr.

DebugBar for IE 8 indique que la demande et la réponse se sont déroulées exactement comme prévu - aucune erreur du tout. IE 8 ne montre aucune erreur ni quoi que ce soit - un écran blanc pur (ou la page qui était affichée avant d'essayer de charger le fichier PDF). Cache effacé/cookies/etc.

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

43
DougN

Je pensais revenir et donner la réponse finale.

Merci à tous ceux qui ont suggéré "Ne sauvegardez pas les pages cryptées sur le disque".

J'ai suivi le conseil d'Eric Law et mis:

Cache-Control: private 

J'ai également constaté que j'avais Pragma: no-cache, que j'ai enlevé.

Ça fonctionne parfaitement maintenant :)

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

a fait le tour pour nous dans IE8 et IE9. 

Cela n'a pas nécessité de modifier les paramètres dans le navigateur.

10
so_mv

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

...puis avec la panique immédiate, j'ai commencé à regarder le code (ASP.NET utilisant VB). J'ai utilisé fiddler et j'ai constaté que même lorsque je ne spécifiais pas l'en-tête de contrôle du cache, le framework me spécifiait automatiquement no-store. La solution pour résoudre ce 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, le temps nécessaire à Adobe Reader pour 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.ToString)
Response.BinaryWrite(mem_stream.ToArray())
Response.Flush()
Response.End()                                

Mettre à jour: Je pensais que cela fonctionnait, mais je suppose que j'ai parlé trop tôt. J'ai créé une nouvelle question pour donner suite à ce problème.

10
wweicker

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

Voici une méthode que j'ai déjà utilisée pour restituer des 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.ToString());
        Response.BinaryWrite(documentBytes);
        Response.Flush();
        HttpContext.Current.ApplicationInstance.CompleteRequest();
    }

** Un pseudo-cache se produit, mais le temps nécessaire à Adobe Reader pour charger le fichier PDF. J'ai cherché une référence décrivant de quoi je parle, et un fil de discussion aléatoire est le mieux que je puisse faire:

IE stocke le PDF dans alloué mémoire «volatile» et lieux un pointeur dans% system% Temp. C'est le seul endroit où le fichier est stocké. Le le pointeur est supprimé et alloué la mémoire est libérée dès que Adobe Le lecteur est fermé.

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

3
lance

Exécutez-vous la version 32 bits ou 64 bits de IE sur Vista 64? Il vient avec les deux. La plupart du temps, la version 32 bits est utilisée car peu de plugins prennent encore 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, il pourrait s'agir d'un problème avec la version 64 bits de l'objet Browser Helper Object (BHO).

En outre, vérifiez (via la présence d'un «* 32» après le nom du processus dans le Gestionnaire des tâches) si les autres navigateurs s'exécutent en mode 32 bits.

Une autre chose que je voudrais vérifier pour savoir si HTTPS empêche IE8 de mettre en cache 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 vous remarquiez un fichier PDF en cours d’écriture dans le système de fichiers. Il est possible que vous deviez modifier un paramètre de stratégie. Je ne sais pas s'il existe une autre façon de dire que vous avez un PDF qui ne devrait pas être écrit sur le disque mais qui pourrait quand même être affiché.

0
Jeff Moser

En tant qu'utilisateur, je rencontrais le même problème lors du chargement de fichiers pdf depuis Schwab.com. Le conseil "désactiver" Ne sauvegardez pas les pages cryptées sur le disque dans l'onglet Avancé de la boîte de dialogue Options Internet: http://support.Microsoft.com/kb/812935 "a fonctionné pour moi.

0
Ronnie Smith

Ma solution (il nous a fallu des jours de jeu 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.ToString());

                System.Web.HttpContext.Current.Response.BinaryWrite(document.Data);
            }

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

0
metroas