Domanda

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

Che cosa facciamo in Asp.Net 1.1.4332 applicazione è il seguente:

un pulsante che attiva un evento del server che esegue alcune operazioni di elaborazione e inserisce i dati in un oggetto di sessione dopo che il codice riportato di seguito viene eseguito :

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

si apre una pagina che i flussi di un pdf per la nuova finestra del browser

in sostanza, con il seguente codice ( so che roba è, qui mancano, ma che in realtà non mater per la domanda)

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

Va bene questo codice funziona !

Non solo in IE6 e IE7 quando si utilizza HTTPS

Quando si utilizza IE6 con HTTPS, i risultati in una finestra "salva come" (non in formato pdf che viene visualizzato in un browser) Quando si utilizza IE7 con HTTPS si traduce in una schermata vuota Quando si utilizza Firefox funziona bene

Se simulo l'extra elaborazione del lato server nel page_load di mettere i dati richiesti nella sessione e sostituire il pulsante con un link che apre la stessa generazione dei file pdf pagina in una nuova finestra, il codice funziona.

Per l'effettiva applicazione non è un'opzione per ottenere i dati richiesti prima che il pulsante viene cliccato.

Così mi piacerebbe davvero avere il seguente codice funziona

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

Domande: Qualcuno sa perché questo codice non funziona in IE6 e IE7 quando si utilizza HTTPS ?Ciò che è necessario per ottenere il codice di lavoro ?

Extra info:

  • Ho cercato di non utilizzo di risposta.scrivere, ma solo un javascript window.aperto dietro il pulsante, questo ha lo stesso effetto
  • quando googling for pdf in streaming, è possibile trovare un sacco di persone che hanno problemi con questo, la maggior parte sono impostati intestazione di lunghezze o di altre proprietà o statico di compressione di file bandiere in IIS.Io sono abbastanza fiducioso li ho provati tutti.
  • Adobe acrobat reader impostazioni, impostazioni del browser o qualsiasi altro client impostazioni di lato, non sembrano essere il problema.Testato su diversi macchine, con http opere, con https non è così.
  • Commutazione tra https e del http che potrebbe avere qualcosa a che fare con questo, ma quando ho impostato IE dire a me quando ho sono di commutazione, nessuna commutazione sembra verificarsi durante i test.
  • Quando si sostituisce la finestra.parte aperta con una risposta.reindirizzare quindi funziona anche il codice, solo che non in una nuova finestra

Qualsiasi aiuto sarebbe molto apprezzato !


Come richiesto, le intestazioni, come mostrato da Fiddler:

   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
È stato utile?

Soluzione 3

Dopo molte prove ed errori ho trovato una soluzione funzionante, ancora non sono sicuro del motivo per cui l'altro codice non funziona.

Questo codice funziona:

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

Deve avere qualcosa a che fare con il tipo mime.

Tuttavia ha un problema. Quando IE è impostato per mostrare quando si passa tra HTTP e HTTPS questo codice fornirà quel messaggio due volte. Il codice seguente non cambia ma fa sì che il caricamento della pagina di ApkRapportPage venga attivato due volte.

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

Altri suggerimenti

Ottenere allegati per aprire il modo in cui si desidera che ha tutto a che fare con le intestazioni si invia.Se si individua un .pagina aspx che si desidera agire come un PDF dinamici risorsa queste intestazioni HTTP diventare sempre più importante.

Questo sito stati un certo numero di motivi per cui potrebbe non funzionare in IE.

  1. Impostare il content-type della risposta di "application/pdf", ex.risposta.setContentType("application/pdf");
  2. Aggiungere un parametro fittizio alla fine dell'url, come: http://x.y.z/DoGenCompStmt?filename=dummy.pdf perché IE ignora tipo di contenuti, quindi è necessario dare un suggerimento, e l' ".pdf" estensione è un modo semplice.
  3. Impostare il "content-length" sulla risposta, altrimenti l'Acrobat Reader plugin potrebbe non funzionare correttamente, ex.risposta.setContentLength(bos.size());
  4. Un ulteriore cosa che sembra aiutare alcuni browser diversi da IE è anche :risposta.setHeader("Content-Disposition", "inline;filename=somepdf.pdf");

EDIT: dato che hai già provato tutto quanto sopra posso solo punto per i rfc per i contenuti disposizione che, a mia conoscenza, è l'unico modo per raccontare un browser come trattare con contenuto binario.

MODIFICA:quello che sarebbe davvero aiutare è quello di vedere le Intestazioni HTTP attualmente restituisce quando si tenta di aprire il file pdf nel browser. Fiddler fa un grande lavoro a catturare il traffico

Faresti meglio a usare un gestore generico (.ASHX) per pubblicare questo tipo di contenuto, piuttosto che provare a forzare una pagina web a pubblicare contenuti diversi dall'HTML.

Se si ottiene una pagina vuota quando si tenta di visualizzare un PDF inline nel browser IE7 e si utilizza Acrobat versione 6. Aggiornare la versione di Acrobat per risolvere il problema.

Nota che questo problema non è correlato a HTTPS, lo stesso problema (e la stessa correzione) si applica a HTTP.

La correzione funziona perché il problema con IE è che non visualizza PDF in una finestra aperta da script se il PDF viene caricato contemporaneamente. (Sconosciuto perché, ma questo è il nocciolo del problema e la correzione.)

Ho notato che il tipo di contenuto restituito è nascosto

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

Quando esegui lo streaming del contenuto sulla pagina aspx assicurati di impostare

Response.charset = ""
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top