Frage

Ich bin Streaming ein PDF an den Browser in ASP.NET 2.0. Dies funktioniert in allen Browsern über HTTP und alle Browser außer IE über HTTPS. Soweit ich weiß, verwendeten diese (in den letzten 5 Jahren oder so) zu arbeiten, in allen Versionen von IE, aber unsere Kunden sind erst seit kurzem berichten Probleme gestartet. Ich vermute, dass das Verschlüsselte Seiten nicht auf der Festplatte speichern Sicherheitsoption verwendet standardmäßig deaktiviert und an einem gewissen Punkt wurde standardmäßig aktiviert (Internetoptionen -> Erweitert -> Sicherheit). diese Option Ausschalten hilft, als Behelfslösung, sondern als langfristige Lösung nicht realisierbar.

Die Fehlermeldung Ich erhalte ist:

  

Internet Explorer nicht herunterladen kann OutputReport.aspx von www.sitename.com.

     

Internet Explorer war nicht fähig, diese Internet-Seite zu öffnen. Die angeforderte Seite ist entweder nicht verfügbar oder nicht gefunden werden kann. Bitte versuchen Sie es später noch einmal.

Das Tool verwendet, um das PDF zu erstellen, ist Active von DataDynamics . Sobald die PDF erstellt wird, hier ist der Code, es zu herabs:

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

Hinweis: Wenn ich nicht explizit Cache-Control geben Sie dann sendet .NET no-cache in meinem Namen, so habe ich versucht, das Einstellen von Cache-control: private oder öffentliche oder maxage = #, aber keiner von denen scheinen Arbeit.

Hier ist die Wendung: wenn ich Fiddler ausführen, um die Antwort-Header zu prüfen, funktioniert alles einwandfrei. Die Header, die ich erhalte, sind:

  

HTTP / 1.1 200 OK
  Cache-Control: max-age = 1 |   Datum: Mi, 29. Juli 2009 17.57.58 GMT
  Content-Type: application / pdf
  Server: Microsoft-IIS / 6.0
  Microsoftofficewebserver: 5.0_Pub
  X-Powered-By: ASP.NET
  X-ASPNET-Version: 2.0.50727
  Content-Disposition: attachment; filename = Statements
  Content-Encoding: gzip
  Vary: Accept-Encoding
  Transfer-Encoding: Chunked

Sobald ich Fiddler ausschalten und versuchen Sie es erneut, es nicht wieder. Eine andere Sache, die ich bemerkt, dass, wenn Fiddler läuft ich eine Es gibt ein Problem mit dem Sicherheitszertifikat der Webseite Warnmeldung, und ich muss auf dieser Website fortsetzen (nicht empfohlen) durchzukommen. Wenn Fiddler ausgeschaltet ist, ich diese Sicherheitswarnung nicht auftreten und es nicht sofort.

Ich bin gespannt, was zwischen Fiedler und dem Browser geschieht so, dass es funktioniert, wenn Fiddler läuft, aber bricht, wenn es nicht ist, aber noch wichtiger ist, hat jemand irgendwelche Ideen, wie ich den Code ändern könnte PDFs IE so Streaming funktioniert ohne Änderungen an der Client-Maschine zu machen?

Update:. Die Fiddler Probleme behoben sind, ich danke Ihnen sehr EricLaw, so dass nun verhält es konsequent (gebrochen, mit oder ohne Fiddler läuft)

Basierend auf Google-Suche, scheint es viele Berichte dieser gleichen Ausgabe alle über das Internet, die jeweils mit einer eigenen spezifischen Kombination von Response-Header zu sein, scheint das Problem für ihre Einzelfälle zu beheben. Ich habe viele dieser Vorschläge ausprobiert, darunter das Hinzufügen eines ETag, LastModified Datum, den Header Vary entfernt (mit Fiddler) und Dutzende von Kombinationen der Cache-Control und / oder Pragma-Header. Ich habe versucht, "Content-Transfer-Encoding: binary" sowie "application / Kraft-Download" für die Contenttype. Nichts hat bisher geholfen. Es gibt eine paar Microsoft KB Artikel , von denen alle zeigen, dass Cache-Control: no-cache der Schuldige ist. Jede andere Ideen?

Update:. By the way, der Vollständigkeit halber, diese gleiche Problem tritt mit Excel und Word gibt auch

Update: keine Fortschritte gemacht worden. Ich mailte die .SAZ Datei aus Fiddlihn EricLaw und er war in der Lage, das Problem zu reproduzieren, wenn IE Debuggen, aber es gibt keine Lösungen vor. Bounty wird abzulaufen ...

War es hilfreich?

Lösung 2

Nach zwei Wochen auf eine Reihe von Ungereimtheiten, war ich nicht in der Lage eine beliebige Kombination von Code-Änderungen zu finden, die diese Methode von Streaming-PDF, Excel oder Word-Dokumente erlauben, wenn die ‚ Verschlüsselte Seiten nicht auf der Festplatte speichern ‘Option aktiviert ist.

Microsoft hat gesagt, dieses Verhalten von Entwurf in einer Reihe von KB-Artikeln und privaten E-Mail ist. Es scheint, dass, wenn die ‚ Verschlüsselte Seiten nicht auf der Festplatte speichern ‘ Option aktiviert ist, dass der IE korrekt verhält und zu tun, was es erzählt wird, zu tun. Dieser Beitrag die beste Ressource, die ich bisher gefunden habe, dass diese Einstellung erklärt, warum aktiviert werden würde, und die Vor- und Nachteile es ermöglichen:

  
    
      

"Die‚ Verschlüsselte Seiten nicht auf der Festplatte speichern ‘kommt ins Spiel, wenn mit SSL Umgang Verbindungen (HTTPS). Genau wie ein Web-Server kann done Informationen senden, wie man eine Datei in den Cache kann im Grunde Internet Explorer einrichten keine Dateien während einer SSL-Verbindung (HTTPS) unabhängig in den Cache zu speichern, wenn der Web-Server berät Sie können.

             

Was ist der Kopf zum Drehen dieser Funktion auf, die Sicherheit ist die Zahl ein Grund, warum die Funktion eingeschaltet ist. Die Seiten werden nicht in der Temporary Internet Files-Cache gespeichert.

             

Was ist der Nachteil? Geringe Leistung, da nichts in den Cache gespeichert wird auch das 1-Byte-GIF-Bild verwendete ein Dutzend Mal auf der Seite muss vom Webserver jedes Mal abgerufen werden. Um die Sache noch schlimmer können einige Benutzeraktionen nicht wie heruntergeladene Dateien gelöscht und ein Fehler dargestellt oder das Öffnen von PDF-Dokumente werden fehlschlagen, ein paar Szenarien zu nennen. "

    
  

Die beste Lösung, die wir an dieser Stelle finden können, ist für unsere Kunden und Benutzer zu kommunizieren, dass es Alternativen geben, diese Einstellung zu verwenden:

  
    
      

"Use‚Leere Ordner Temporary Internet Files, wenn Browser geschlossen wird.‘Jedes Mal, wird der Browser geschlossen alle Dateien aus dem Cache gelöscht werden vorausgesetzt, es ist keine Sperre für eine Datei von einer anderen Instanz des Browsers oder einer externen Anwendung.

             

braucht viel Beachtung geschenkt werden, bevor unter Verwendung von ‚ nicht speichern verschlüsselte Seiten auf dem Datenträger ‘. Klingt wie ein großes Sicherheitsmerkmal und es ist, aber die Ergebnisse der Verwendung dieser Funktion können Sie Ihre Help Desk verursachen rufen zum Download Ausfall oder langsame Leistung zu gehen. "

    
  

Andere Tipps

Cache-Control Header ist falsch. Es sollte seine Cache-Control: max-age = 1 mit dem Strich in der Mitte. Versuchen Festsetzung, dass zuerst zu sehen, ob es einen Unterschied macht.

Normalerweise würde ich sagen, dass die wahrscheinlichste Ursache ist Ihre Header Vary, als solche Header oft zu Problemen führen, mit Caching im IE: http://blogs.msdn.com/ieinternals/archive/2009/06/17/9769915.aspx . Vielleicht möchten Sie eine ETAG zu den Antwort-Header, um zu versuchen hinzuzufügen.

Fiddler sollte keine Auswirkungen auf Cachebarkeit haben (es sei denn, Sie Regeln geschrieben haben), und es klingt wie Sie sagen, dass es tut, was das vielleicht schon sagt ein Timing-Problem irgendeiner Art gibt.

> Verschlüsselte Seiten nicht auf der Festplatte speichern Sicherheitsoption verwendet standardmäßig deaktiviert

Diese Option ist immer noch standardmäßig deaktiviert (in IE6, 7 und 8), obwohl es sie einschalten über Gruppenrichtlinien können Administratoren und einige große Unternehmen tun.

Übrigens ist der Grund, warum Sie das Zertifikat Fehler sehen, während Fiddler ausgeführt ist, dass Sie nicht die Fiddler Root-Zertifikat vertrauen gewählt haben; finden Sie unter http://www.fiddler2.com/fiddler/help/httpsdecryption.asp für mehr zu diesem Thema.

Ich hatte ein ähnliches Problem mit PDF-Dateien, die ich streamen wollte. Auch bei Response.ClearHeaders() sah ich Pragma und Cache-Control-Header zur Laufzeit hinzugefügt. Die Lösung bestand darin, die Header in IIS (Rechtsklick -> Eigenschaften auf der Seite der PDF-Laden, dann „Http-Header“ tab) zu löschen.

Ich fand, dass dies schien für mich zu arbeiten:

Dim browser As System.Web.HttpBrowserCapabilities = Request.Browser
If (browser.Browser = "IE") Then
  Response.AppendHeader("cache-control", "private") ' ie only
Else
  Response.AppendHeader("cache-control", "no-cache") ' all others (FF/Chrome tested)
End If

GELöST: Dies ist ein IE-Problem, nicht von aplication ... fixieren Sie es mit dieser: http://support.microsoft.com/kb/323308 Es funktioniert perfekt für mich, nach dem Versuch für eine lange Zeit.

ATT: Mr.Dark

Wir haben ein ähnliches Problem langer Zeit konfrontiert - was wir taten, war wir (das ist Java EE). In der Web-Anwendung Config wir fügen

<mime-mapping>
    <extension>PDF</extension>
    <mime-type>application/octet-stream</mime-type>
</mime-mapping>

Dies wird jede pdf machen aus Ihrer Web-Anwendung kommt anstelle des Browsers heruntergeladen werden versuchen, zu machen.

Bearbeiten : sieht aus wie Sie es streamen. In diesem Fall erhalten Sie einen MIME-Typen als application / octet-stream im Code und nicht in der Config verwenden. Also hier anstelle von

Response.ContentType = "application/pdf"

Sie verwenden

Response.ContentType = "application/octet-stream"

Welche Version von IE? Ich erinnere daran, dass Microsoft veröffentlicht einen Hotfix für IE6 für dieses Problem. Hoffe, das ist von Nutzen?

Ich las Ihre Cache-control Gans jagen, aber ich werde teilen Mine, die meine Bedürfnisse erfüllt , falls es hilft.

versuchen gzip-Komprimierung zu deaktivieren.

es hier Hinzufügen der Hoffnung, dass jemand dies nützlich, anstatt gehen durch die Links finden.

Hier ist mein Code

    byte[] bytes = // get byte array from DB

    Response.Clear();
    Response.ClearContent();
    Response.ClearHeaders();
    Response.Buffer = true;

    // Prevent this page from being cached.
    //  NOTE: we cannot use the CacheControl property, or set the PRAGMA header value due to a flaw re: PDF/SSL/IE
    Response.Expires = -1; 

    Response.ContentType = "application/pdf";
    // Specify the number of bytes to be sent
    Response.AppendHeader("content-length", bytes.Length.ToString());

    Response.BinaryWrite(bytes);    

            // Wrap Up
    Response.Flush();
    Response.Close();
    Response.End();

Wie die OP ich den Kopf kratze für Tage versucht, diese Arbeit zu bekommen, aber ich habe es am Ende so dachte ich, ich würde meine ‚Kombination‘ von Headern teilen:

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

Hoffnung, dass jemand irgendwo etwas Schmerz erspart!

Ich war in einem ähnlichen Problem läuft mit dem Versuch, ein PDF über SSL zu streamen und in einem Iframe oder Objekt setzen diese. Ich war zu finden, dass meine aspx Seite halten würde die nicht sichere Version der URL umgeleitet, und der Browser würde es blockieren.

Ich fand Umschalten von einer ASPX-Seite zu einem ASHX Handler fixierte meine Umleitung Problem.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top