Question

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

Ce que nous faisons dans une application Asp.Net 1.1.4332 est le suivant:

un bouton déclenche un événement de serveur qui effectue un traitement et place les données dans un objet de session après l'exécution du code suivant:

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

Ceci ouvre une page qui diffuse un pdf dans la nouvelle fenêtre du navigateur

essentiellement avec le code suivant (je sais qu'il manque des éléments ici, mais cela n'a pas d'importance pour la question)

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

D'accord, ce code fonctionne!

Simplement pas dans IE6 et IE7 avec HTTPS

Lorsque IE6 avec HTTPS est utilisé, une boîte de dialogue Enregistrer sous (et non un fichier PDF qui s'ouvre dans un navigateur) Lorsque IE7 est utilisé avec HTTPS, l’écran est vide. Lorsque vous utilisez Firefox, cela fonctionne très bien

Si je simule le traitement supplémentaire côté serveur dans le chargement de page afin de mettre les données requises dans la session et de remplacer le bouton par un lien qui ouvre la même page de génération de pdf dans une nouvelle fenêtre, le code fonctionne.

Pour l'application réelle, il n'est pas possible d'obtenir les données requises avant de cliquer sur le bouton.

Je voudrais donc vraiment que le code suivant fonctionne

   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

Questions: Est-ce que quelqu'un sait pourquoi ce code ne fonctionne pas dans IE6 et IE7 avec HTTPS? Que faut-il pour que le code fonctionne?

Infos supplémentaires:

  • J'ai essayé de ne pas utiliser response.write mais juste une fenêtre javascript.ouvrez derrière le bouton, cela a le même effet
  • lors de la recherche sur Google pour le streaming pdf, vous pouvez trouver beaucoup de personnes ayant problème avec cela, la plupart du temps ils ont mis longueurs d'en-tête ou d'autres propriétés ou drapeaux de compression de fichiers statiques dans IIS. Je suis assez confiant je les ai essayés tous.
  • Paramètres de Adobe Acrobat Reader, paramètres de navigateur ou tout autre client réglages latéraux ne semblent pas être le problème. Testé sur différents machines, avec http fonctionne, avec https ça ne marche pas.
  • La commutation entre https et http peut avoir un rapport avec cela, mais quand je mets IE pour me dire quand je suis la commutation, aucune commutation ne semble se produire pendant les tests.
  • Lors du remplacement de la partie window.open par un response.redirect, le code fonctionne également, mais pas dans une nouvelle fenêtre

Toute aide serait grandement appréciée!

Comme demandé, les en-têtes indiqués par Fiddler sont les suivants:

<*>
Était-ce utile?

La solution 3

Après de nombreux essais et erreurs, j'ai trouvé une solution qui fonctionne, mais je ne sais toujours pas pourquoi l'autre code ne fonctionne pas.

Ce code fonctionne:

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

Doit avoir quelque chose à voir avec le type mime.

Il y a un problème cependant. Lorsque IE est configuré pour afficher lorsque vous basculez entre HTTP et HTTPS, ce code donnera ce message deux fois. Le code suivant ne change pas mais provoque le chargement de la page de ApkRapportPage deux fois.

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

Autres conseils

Obtenir que les pièces jointes s’ouvrent comme vous le souhaitez est lié aux en-têtes que vous envoyez. Si vous indiquez sur une page .aspx que vous souhaitez agir en tant que ressource PDF dynamique, ces en-têtes HTTP deviennent de plus en plus importants.

Ce site Web explique pourquoi il pourrait ne pas fonctionner. IE.

  1. Définissez le type de contenu de la réponse sur " application / pdf " ;, ex. response.setContentType (" application / pdf ");
  2. Ajoutez un paramètre factice à la fin de l'URL, par exemple:    http: //x.y.z/DoGenCompStmt? filename = dummy.pdf   Parce que IE ignore les types de contenu, vous devez donc lui donner un indice, et le " pdf .pdf " l'extension est un moyen facile.
  3. Définissez la " longueur du contenu " sur la réponse, sinon le plugin Acrobat Reader risque de ne pas fonctionner correctement, ex. response.setContentLength (bos.size ());
  4. Une autre chose qui semble aider certains navigateurs IE est d'avoir aussi: response.setHeader (& "Content-Disposition &", & "inline; filename = somepdf.pdf quot;);

MODIFIER: puisque vous avez déjà essayé toutes les solutions ci-dessus, je ne peux que vous indiquer le rfc pour la disposition du contenu , qui, à ma connaissance, est le seul moyen de dire à un navigateur comment gérer le contenu binaire.

MODIFIER : ce qui serait vraiment utile, c'est de voir les en-têtes HTTP qu'il renvoie actuellement lorsque vous essayez d'ouvrir le fichier PDF dans le navigateur. Fiddler parvient à capturer le trafic

Vous feriez mieux d'utiliser un gestionnaire générique (.ASHX) pour servir ce type de contenu plutôt que d'essayer de forcer une page Web à servir un contenu autre que HTML.

Si vous obtenez une page vierge lorsque vous essayez d'afficher un fichier PDF intégré dans le navigateur IE7 et que vous utilisez Acrobat version 6. Mettez à jour votre version d'Acrobat pour résoudre le problème.

Notez que ce problème n'est pas lié à HTTPS, le même problème (et le même correctif) s'applique à HTTP.

Le correctif fonctionne parce que le problème avec IE est qu’elle n’affiche pas le PDF dans une fenêtre ouverte si le script est chargé en même temps. (On ne sait pas pourquoi, mais c'est le cœur du problème et le correctif.)

Je remarque que votre type de contenu renvoyé est bloqué

" type de contenu: application / pdf; jeu de caractères = utf-8 "

Lorsque vous diffusez le contenu sur la page aspx en streaming, assurez-vous de définir la

Response.charset = ""
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top