it-swarm.com.de

Kann nicht angezeigt werden PDF von HTTPS in IE 8 (bei 64-Bit-Vista)

Ich habe einen hauseigenen HTTPS-Server, der einfache Dateien bereitstellt (in meine App eingebettet). Es funktioniert großartig - ich habe es schon immer benutzt.

Kürzlich hinzugefügte SSL-Unterstützung - Chrome, FireFox und IE alle mögen es und laden Seiten gut.

Das Problem ist, wenn ich versuche, eine PDF -Datei über die HTTPS-Verbindung zu laden. Aus irgendeinem Grund wird PDF niemals in IE 8 angezeigt (64-Bit bei 64-Bit-Vista). Es funktioniert einwandfrei in Chrome ..__ und funktioniert einwandfrei in IE 8, wenn reines HTTP verwendet wird - nur bei Verwendung von HTTPS.

HINWEIS: Wenn IE 8 erwähnt wird, ist es unter 64-Bit-Vista 32-Bit IE 8, obwohl 64-Bit IE 8 dasselbe Verhalten aufweist.

Das lässt mich denken, dass es eine Art IE 8/HTTPS/PDF/64-Bit-Betriebssystemproblem ist, aber ich bin mir nicht sicher.

DebugBar für IE 8 zeigt, dass die Anforderung und Antwort genau wie erwartet ausgeführt wurden - überhaupt keine Fehler. IE 8 zeigt keine Fehler oder irgendetwas - reinen weißen Bildschirm (oder die Seite, die vor dem Laden der PDF-Datei angezeigt wurde). Cache/Cookies/etc gelöscht.

Gibt es bekannte Probleme mit IE/PDF/HTTPS?

43
DougN

Ich dachte, ich würde zurückkommen und die endgültige Antwort geben.

Vielen Dank an alle, die vorgeschlagen haben, "verschlüsselte Seiten nicht auf der Festplatte speichern".

Ich folgte EricLaws Rat und stellte Folgendes ein:

Cache-Control: private 

Ich fand auch, dass ich Pragma: no-cache hatte, den ich entfernte.

Funktioniert jetzt wie ein Zauber :)

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

tat den Trick für uns in IE8 und IE9. 

Dafür mussten keine Einstellungen im Browser geändert werden.

10
so_mv

Ich bin auf dieses Problem gestoßen und konnte es nur zum Laufen bringen, indem ich den Benutzer auffordere, seine Sicherheitseinstellungen zu ändern, um ihn auszuschalten Speichern Sie verschlüsselte Seiten nicht auf der Festplatte auf der Registerkarte "Erweitert" des Dialogfelds "Internetoptionen": http://support.Microsoft.com/kb/812935

...dann Mit der unmittelbaren Panik begann ich den Code zu betrachten (ASP.NET mit VB). Ich verwendete Fiddler und stellte fest, dass selbst wenn ich den Cache-Control-Header nicht spezifizierte, es schien, als würde das Framework automatisch No-Store für mich angeben. Der Schlüssel zur Lösung des Problems lag tatsächlich in this PHP - Frage . Setzen Sie den Cache-Control-Header auf maximalalter = 1 Die Datei wird für 1 Sekunde zwischengespeichert. Dies ist gerade so lang, dass der Adobe Reader sie von der Festplatte abrufen und in den Speicher laden kann. Ich habe unseren Code aktualisiert, um die PDF wie folgt zu generieren:

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

Aktualisieren: Ich dachte, es würde funktionieren, aber ich glaube, ich habe zu früh gesprochen. Ich habe eine neue Frage erstellt, um dieses Problem zu lösen.

10
wweicker

Ich hatte ein ähnliches Problem mit IE8 und https. Als ich versuchte, ein PDF in ein neues Fenster zu streamen, erhielt ich stattdessen eine leere HTML-Seite (dies funktionierte in FireFox und wenn es nicht über https war). Nach vielen Recherchen und Versuchen mit verschiedenen Variationen der Antwortheader bestand die Lösung für mich darin, Folgendes festzulegen:

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

Dadurch wird das gesamte PDF heruntergeladen, bevor es geöffnet wird. Dies ist weniger benutzerfreundlich, wenn es sich um ein sehr großes PDF handelt. Aber in meinem Fall waren die meisten PDFs nur ein paar Seiten. Hoffe das hilft jemandem aus.

4
Daniel Lee

Ich sehe in Ihrer Frage keinen Hinweis auf .NET, aber ich werde eine verwandte Lösung anbieten. Hoffentlich können Sie daraus entnehmen, was Sie brauchen, und Entwickler, die annehmen, dass sich Ihre Frage auf .NET bezieht, könnten ebenfalls einen Wert darin finden.

Hier ist eine Methode, die ich zuvor zum Rendern von In-Browser-PDFs über HTTPS ohne ** Caching verwendet habe.

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

** Es tritt ein pseudo-cache auf, der gerade so lang ist, dass Adobe Reader die Datei PDF laden kann. Ich suchte nach einer Referenz, die beschreibt, worüber ich spreche, und einen zufälligen Forenthread ist das Beste, was ich tun könnte:

IE speichert die PDF in zugewiesen "flüchtiger" Speicher und Orte ein Zeiger in% system% Temp. Das ist Der einzige Ort, an dem die Datei gespeichert wird. Das Der Zeiger wird gelöscht und zugewiesen Speicher wird freigegeben, sobald Adobe Der Leser ist geschlossen.

Ich kann nicht für die technische Genauigkeit bürgen, aber es spiegelt wider, was ich mit der obigen Methode beobachtet habe. Ich glaube, die Datei verschwindet, sobald das Laden in Adobe Reader (im Browser) abgeschlossen ist.

3
lance

Führen Sie die 32-Bit- oder 64-Bit-Version von IE unter Vista 64 aus? Es kommt mit beidem. Meistens wird die 32-Bit-Version verwendet, da noch nicht viele Plugins 64-Bit unterstützen.

Ich würde nachsehen, ob es einen Unterschied zwischen den beiden gibt. Wenn es unter IE 8 32-Bit unter Vista 64 funktioniert, könnte dies ein Problem mit der 64-Bit-Version des Browser Helper Object (BHO) sein.

Überprüfen Sie auch, ob (nach einem Prozessnamen durch den Task-Manager ein '* 32' vorhanden ist), ob die anderen Browser im 32-Bit-Modus ausgeführt werden.

Eine andere Sache, die ich prüfen würde, ob HTTPS aus irgendeinem Grund dazu führt, dass IE8 die Datei PDF nicht zwischenspeichert (HTTPS-Datenverkehr wird normalerweise nicht zwischengespeichert). Ich würde procmon ausführen, um zu sehen, ob eine Datei PDF in das Dateisystem geschrieben wird. Möglicherweise müssen Sie Richtlinieneinstellungen vornehmen, die Sie möglicherweise ändern müssen. Ich bin nicht sicher, ob es eine alternative Möglichkeit gibt zu sagen, dass Sie eine PDF haben, die nicht auf die Festplatte geschrieben werden sollte, aber trotzdem angezeigt werden könnte.

0
Jeff Moser

Als Benutzer hatte ich das gleiche Problem beim Laden von PDF-Dateien von Schwab.com. Die Empfehlung "Deaktivieren Sie verschlüsselte Seiten nicht auf der Festplatte speichern" auf der Registerkarte "Erweitert" des Dialogfelds "Internetoptionen": http://support.Microsoft.com/kb/812935 "hat für mich funktioniert.

0
Ronnie Smith

Meine Lösung (es dauerte Tage, bis wir mit Headern herumgespielt hatten, um das zum Laufen zu bringen):

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

Hoffe das hilft jemandem

0
metroas