Frage

Response.Write("<script language=\"javascript\">window.open( with https and pdf

Was wir in einer Asp.Net 1.1.4332 Anwendung tun, ist die folgende:

eine Taste löst einen Server Ereignis, das einige Verarbeitung tut und stellt die Daten in einem Sitzungsobjekt nach, dass der folgende Code ausgeführt wird:

string page = Request.ApplicationPath + "/ApkRapportPage.aspx";    
Response.Write("<script language=\"javascript\">window.open('" + page + "','_new');</script>");

Es öffnet sich eine Seite, die ein pdf zum neuen Browserfenster Ströme

im Grunde mit dem folgenden Code (ich weiß, Sachen hier fehlen, aber das ist nicht wirklich mater für die Frage)

byte [] pdfbytes = Convert.FromBase64String (rapportB64);

Response.ClearContent();
Response.ClearHeaders();
Response.Buffer = true;
Response.ContentType = GetContentType(format);
string header = GetContentDispostionHeader(fileName, format, type);
Response.AddHeader("Content-Disposition", header);
Response.BinaryWrite(pdfbytes);         
Response.End();

Okay, dieser Code funktioniert!

Nur nicht in IE6 und IE7 bei der Verwendung von HTTPS

Wenn IE6 mit HTTPS ergibt sich ein Speichern unter-Dialog (kein PDF, die in einem Browser geöffnet wird) Wenn IE7 mit HTTPS führt es in einem leeren Bildschirm Wenn Firefox funktioniert es ganz gut

Wenn ich die zusätzliche Server-Seite Verarbeitung in der page_load simuliere die erforderlichen Daten in der Sitzung zu setzen und auf die Schaltfläche mit einem Link zu ersetzen, die die gleiche PDF-Erzeugungs Seite in einem neuen Fenster geöffnet wird, der Code funktioniert.

Für die eigentliche Anwendung ist es keine Option, die erforderlichen Daten zu erhalten, bevor die Schaltfläche geklickt wird.

Also ich mag wirklich den folgenden Code an der Arbeit

string page = Request.ApplicationPath + "/ApkRapportPage.aspx";    
Response.Write("<script language=\"javascript\">window.open('" + page + "','_new');</script>");

Fragen: Weiß jemand, warum dieser Code nicht in IE6 und IE7 funktionieren, wenn HTTPS verwenden? Was benötigt wird, um den Code zu bekommen zu arbeiten?

Zusätzliche Informationen:

  • Ich habe versucht, nicht mit response.write aber nur ein Javascript hinter window.open die Taste, so hat dies den gleichen Effekt
  • wenn für pdf-Streaming googeln, können Sie eine Menge Leute finden, die mit diesem Problem, vor allem setzen sie Kopflänge oder andere Eigenschaften oder statische Datei-Komprimierung-Flags in IIS. Ich bin mir ziemlich sicher, dass ich versuchte, sie alle.
  • Adobe Acrobat Reader Einstellungen, Browser-Einstellungen oder andere Client Seiteneinstellungen scheinen nicht das zu sein Problem. Getestet auf verschiedene Maschinen, mit http Arbeiten mit https es funktioniert nicht.
  • Wechsel zwischen https und http könnten etwas damit zu tun haben, aber wenn ich gesetzt IE, mir zu sagen, wenn ich am Schalen, scheint kein Umschalten auf treten während des Tests.
  • Wenn der window.open Teil mit einem response.redirect ersetzt dann auch der Code funktioniert, nur nicht in einem neuen Fenster

Jede Hilfe wäre sehr geschätzt werden!


Wie die Header angefordert, wie Fiddler gezeigt:

   HTTP/1.1 200 OK
   Server: Microsoft-IIS/5.1
   Date: Thu, 05 Mar 2009 14:18:36 GMT
   X-Powered-By: ASP.NET
   X-AspNet-Version: 1.1.4322
   Content-Disposition: Inline;filename=APKrapport.pdf
   Cache-Control: private
   Content-Type: application/pdf; charset=utf-8
   Content-Length: 28307
War es hilfreich?

Lösung 3

Nach einer Menge von Versuch und Irrtum fand ich eine Arbeitslösung, immer noch nicht sicher, warum der andere Code funktioniert nicht.

Dieser Code funktioniert:

StringBuilder js = new StringBuilder("<script language=\"javascript\">");
js.Append("_window = window.open(\"\",'_new');");
js.Append("_window.document.open(\"application/pdf\");");
js.Append("_window.location.href = \"ApkRapportPage.aspx\";");  
js.Append("_window.document.close();");
js.Append("</script>");

Response.Write(js.ToString());

muss etwas mit dem MIME-Typ zu tun.

Es hat allerdings ein Problem. Wenn IE gesetzt zu zeigen, wenn Sie zwischen HTTP und HTTPS wird dieser Code der Nachricht zweimal geben. Der folgende Code schaltet nicht aber bewirkt, dass die Seite Last von ApkRapportPage zweimal gebrannt werden.

StringBuilder js = new StringBuilder("<script language=\"javascript\">");
js.Append("_window = window.open(\"ApkRapportPage.aspx\",'_new');");
js.Append("_window.document.open(\"application/pdf\");");
js.Append("_window.location.href = \"ApkRapportPage.aspx\";");  
js.Append("_window.document.close();");
js.Append("</script>");

Response.Write(js.ToString());

Andere Tipps

Anhänge gibt es die Art und Weise zu öffnen Sie wollen alles hat mit den Header, die Sie senden zu tun. Wenn Sie auf eine ASPX-Seite suchen, die Sie als dynamische PDF-Ressource handeln wollen, dass diese HTTP-Header werden immer wichtiger.

Diese Webseite eine Reihe von Gründen erklärt, warum könnte es nicht in IE.

  1. Stellen Sie den Inhaltstyp der Antwort auf „application / pdf“, ab. response.setContentType ( "application / pdf");
  2. Fügen Sie einen Dummy-Parameter am Ende der URL, wie zB:    http: //x.y.z/DoGenCompStmt filename = dummy.pdf   weil IE ignoriert Content-Typen, so müssen Sie ihm einen Hinweis geben, und die „.pdf“ Erweiterung ist ein einfacher Weg.
  3. Stellen Sie den "Content-Length" auf die Antwort, sonst wird der Acrobat Reader-Plugin kann nicht richtig funktionieren, ex. response.setContentLength (bos.size ());
  4. Eine weitere Sache, die einige IE-Browser zu helfen scheint, ist auch haben: response.setHeader ( "Content-Disposition", "inline; filename = somepdf.pdf");

EDIT: , da Sie bereits alle oben versucht, kann ich nur zeigen Sie auf die rfc für Content-Disposition die mein Wissen ist der einzige Weg, einen Browser zu sagen, wie mit binärem Inhalt befassen.

Bearbeiten : Was würde wirklich helfen, die HTTP-Header zu sehen, ist es zur Zeit gibt, wenn Sie versuchen, die pdf im Browser zu öffnen. Fiedler macht einen guten Job bei Verkehr fängt

Sie seien besser dran, einen generischen Handler (.ashx) mit dieser Art von Inhalt zu dienen, anstatt zu versuchen, eine Web-Seite zu zwingen, Inhalten zu dienen andere als HTML.

Wenn Sie eine leere Seite bekommen, wenn eine PDF-Inline im IE7 Browser anzuzeigen versuchen, und Sie sind mit Acrobat Version 6. Aktualisieren Sie Ihr Acrobat-Version Problem zu lösen.

Beachten Sie, dass dieses Problem zu HTTPS nicht verwendet ist, das gleiche Problem (und die gleichen fix) gelten für HTTP.

Das Update funktioniert, weil das Problem mit IE ist, dass es nicht in einem Skript-geöffneten Fenstern PDF nicht angezeigt, wenn das PDF auf einmal geladen wird. (Unbekannt warum, aber das ist der Kern des Problems, und die Lösung.)

ich feststellen, dass Ihr zurück Content-Type abgespritzt

"Content-Type: application / pdf; charset = utf-8"

Wenn Sie den Inhalt der aspx Seite streamen sicherzustellen, dass Sie setzen die

Response.charset = ""
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top