Imansible visualizzare PDF da HTTPS in IE 8 (su Vista a 64 bit)

Ho un server HTTPS cresciuto in casa che serve file semplici (è incorporato nella mia app). Funziona benissimo – lo sto usando per sempre.

Supporto SSL aggiunto di recente: Chrome, FireFox e IE sono tutti uguali e caricano pagine in modo corretto.

Il problema che ho riscontrato è quando provo a caricare un file PDF tramite la connessione HTTPS. Per qualche ragione, il PDF non viene mai visualizzato in IE 8 (64 bit su Vista a 64 bit). Funziona bene in Chrome. E funziona perfettamente con IE 8 quando si utilizza HTTP semplice – fallisce solo quando si usa HTTPS.

NOTA: quando viene menzionato IE 8, è a 32 bit IE 8 su Vista a 64 bit, sebbene l’IE 8 a 64 bit abbia lo stesso comportamento.

Questo mi fa pensare che sia una sorta di problema con IE 8 / HTTPS / PDF / 64-bit OS, ma non ne sono sicuro.

DebugBar per IE 8 mostra la richiesta e la risposta è andata esattamente come previsto – nessun errore. IE 8 non mostra alcun errore o altro – schermo bianco puro (o la pagina che è stata visualizzata prima che provassi a caricare il PDF). Svuota cache / cookie / ecc.

Ci sono problemi noti con IE / PDF / HTTPS?

Ho pensato di tornare e dare la risposta finale.

Grazie a tutti coloro che hanno suggerito “Non salvare pagine crittografate su disco”.

Ho seguito il consiglio di EricLaw e ho impostato:

Cache-Control: private 

Ho anche scoperto che avevo Pragma: no-cache , che ho rimosso.

Funziona come un fascino ora 🙂

Mi sono imbattuto in questo stesso problema e ho potuto farlo funzionare solo chiedendo all’utente di modificare le impostazioni di sicurezza per distriggersre Non salvare le pagine crittografate su disco nella scheda Avanzate della finestra di dialogo Opzioni Internet: http://support.microsoft .com / kb / 812.935

… poi con il panico immediato, ho iniziato a guardare il codice (ASP.NET usando VB). Ho usato il violinista e ho scoperto che anche quando non stavo specificando l’intestazione del controllo della cache sembrava che il Framework specificasse automaticamente il no-store per me. La chiave per risolvere il problema era in realtà in questa domanda PHP . Impostando l’intestazione di controllo della cache su max-age = 1 il file verrà memorizzato nella cache per 1 secondo, appena sufficiente a consentire a Adobe Reader di prelevarlo dal disco e caricarlo in memoria. Ho aggiornato il nostro codice per generare il PDF come segue:

 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() 

Aggiornamento: pensavo che funzionasse, ma credo di aver parlato troppo presto. Ho creato una nuova domanda per seguire questo problema.

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

ha fatto il trucco per noi in IE8 e IE9.

Questo non ha richiesto la modifica delle impostazioni nel browser.

Ho avuto un problema simile con IE8 e https. Quando ho provato a far scorrere un pdf in una nuova finestra, ho ottenuto una pagina HTML vuota (ha funzionato in FireFox e se non era tramite https). Dopo aver cercato e provato diverse varianti delle intestazioni di risposta, la soluzione per me era impostare:

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

Questo scarica l’intero pdf prima dell’apertura che è meno user-friendly se si tratta di un pdf molto grande. Ma nel mio caso la maggior parte dei pdf erano solo poche pagine. Spero che questo aiuti qualcuno fuori.

Nella tua domanda non vedo alcun riferimento a .NET, ma fornirò una soluzione correlata. Spero che tu possa prendere da ciò ciò che ti serve, e gli sviluppatori che ritengono che la tua domanda riguardi .NET potrebbero trovare valore anche in questo.

Ecco un metodo che ho utilizzato in precedenza per eseguire il rendering di PDF in-browser, tramite HTTPS, senza ** 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(); } 

** Esiste una pseudo-cache che si verifica, appena sufficiente a consentire a Adobe Reader di caricare il file PDF. Ho cercato un riferimento che descrivesse di cosa sto parlando e un thread casuale del forum è il meglio che potrei fare:

IE memorizza il PDF nella memoria “volatile” allocata e inserisce un puntatore in% system% Temp. Questo è l’unico posto in cui è archiviato il file. Il puntatore viene eliminato e la memoria allocata viene liberata non appena viene chiuso Adobe Reader.

Non posso garantire l’accuratezza tecnica di ciò, ma riflette ciò che ho osservato usando il metodo di cui sopra. In effetti, penso che il file scompaia al momento del suo caricamento in Adobe Reader (nel browser).

Stai utilizzando la versione a 32 bit o 64 bit di IE su Vista 64? Viene con entrambi. La maggior parte delle volte viene utilizzata la versione a 32 bit poiché non molti plug-in supportano ancora 64 bit.

Controllerò per vedere se c’è una differenza tra i due. Se funziona in IE 8 32 bit su Vista 64, potrebbe trattarsi di un problema con la versione a 64 bit di Browser Helper Object (BHO).

Inoltre, controllare se è presente (tramite la presenza del Task Manager di un ‘* 32’ dopo il nome di un processo) se gli altri browser sono in esecuzione in modalità a 32 bit.

Un’altra cosa che controllerei per vedere se è HTTPS sta causando a IE8 di non memorizzare nella cache il file PDF per qualche motivo (il traffico HTTPS non è in genere memorizzato nella cache). Vorrei eseguire procmon per vedere se si nota un file PDF che viene scritto nel file system. Potrebbero esserci impostazioni di policy che potrebbe essere necessario modificare. Non sono sicuro se esiste un modo alternativo per dire che hai un PDF che non dovrebbe essere scritto su disco ma che potrebbe ancora essere visualizzato.

Come utente, stavo avendo lo stesso problema nel caricare file pdf da Schwab.com. Il consiglio di “distriggersre Non salvare le pagine crittografate su disco nella scheda Avanzate della finestra di dialogo Opzioni Internet: http://support.microsoft.com/kb/812935 ” ha funzionato per me.

La mia soluzione (ci sono voluti giorni di gioco con le intestazioni per farlo funzionare):

  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); } 

Spero che aiuti qualcuno