Question

Je suis en train de diffuser un PDF au navigateur dans ASP.NET 2.0. Cela fonctionne dans tous les navigateurs via HTTP et dans tous les navigateurs sauf IE sur HTTPS. Autant que je sache, cela fonctionnait auparavant (depuis environ 5 ans) dans toutes les versions d'IE, mais nos clients n'ont commencé à signaler les problèmes que récemment. Je soupçonne que l’option de sécurité Ne pas enregistrer les pages cryptées sur le disque était habituellement désactivée par défaut et le devenait à un moment donné (Options Internet - > Avancée - > Sécurité). Désactiver cette option est une solution, mais n’est pas viable à long terme.

Le message d'erreur que je reçois est le suivant:

  

Internet Explorer ne peut pas télécharger le fichier OutputReport.aspx à partir du site Web www.sitename.com.

     

Internet Explorer n'a pas pu ouvrir ce site Internet. Le site demandé n'est pas disponible ou est introuvable. Veuillez réessayer plus tard.

L'outil utilisé pour créer le fichier PDF est ActiveReports, fourni par DataDynamics . Une fois le fichier PDF créé, voici le code pour l'envoyer:

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

Remarque: si je ne spécifie pas explicitement le contrôle du cache, alors .NET n'envoie pas de cache en mon nom. J'ai donc essayé de définir le contrôle du cache sur: privé ou public ou maxage = #, mais aucun de ceux-ci ne semble travail.

Voici le problème: lorsque je lance Fiddler pour inspecter les en-têtes de réponse, tout fonctionne correctement. Les en-têtes que je reçois sont:

  

HTTP / 1.1 200 OK
  Cache-Control: max-age = 1
  Date: mercredi 29 juillet 2009 17:57:58 GMT
  Content-Type: application / pdf
  Serveur: Microsoft-IIS / 6.0
  MicrosoftOfficeWebServer: 5.0_Pub
  X-Powered-By: ASP.NET
  X-AspNet-Version: 2.0.50727
  contenu-disposition: pièce jointe; filename = statement.pdf
  Content-Encoding: gzip
  Vary: Accept-Encoding
  Transfer-Encoding: chunked

Dès que je désactive Fiddler et que je réessaye, il échoue à nouveau. Une autre chose que j'ai remarquée est que lorsque Fiddler est en cours d'exécution, un message d'avertissement lié ??au certificat de sécurité de ce site Web apparaît et je dois cliquer sur Continuer vers ce site Web (non recommandé). passer à travers. Lorsque Fiddler est désactivé, cet avertissement de sécurité ne s'affiche pas et il échoue immédiatement.

Je suis curieux de savoir ce qui se passe entre Fiddler et le navigateur pour que cela fonctionne lorsque Fiddler est en cours d'exécution, mais se casse quand ce n'est pas le cas, mais plus important encore, est-ce que quelqu'un a une idée de la façon dont je pourrais changer mon code afin que le transfert de PDF à IE fonctionne? sans apporter de modifications à la machine cliente?

Mise à jour: Les problèmes de Fiddler sont résolus. Merci beaucoup, EricLaw. Il se comporte donc de manière constante (en panne, avec ou sans Fiddler).

Sur la base de la recherche sur Google, il semble que de nombreux rapports signalent le même problème sur le Web, chacun avec sa propre combinaison d’en-têtes de réponse qui semblent résoudre le problème pour chaque cas particulier. J'ai essayé plusieurs de ces suggestions, notamment l'ajout d'un ETag, de la date LastModified, de la suppression de l'en-tête Vary (à l'aide de Fiddler) et de dizaines de combinaisons des en-têtes Cache-Control et / ou Pragma. J'ai essayé "Content-Transfer-Encoding: binary". ainsi que " application / force-download " pour le ContentType. Rien n'a aidé jusqu'à présent. Il existe un plusieurs Microsoft Ko articles , qui indiquent tous que Contrôle de cache: aucun cache est le coupable. D'autres idées?

Mise à jour: En passant, par souci de complétude, ce même problème se produit également avec les sorties Excel et Word.

Mise à jour: Aucun progrès n'a été accompli. J'ai envoyé le fichier .SAZ par Fiddler à EricLaw et il a été en mesure de reproduire le problème lors du débogage d'IE, mais il n'y a pas encore de solution. Bounty va expirer ...

Était-ce utile?

La solution 2

Après deux semaines de chasse féroce à l'oie, je n'ai trouvé aucune combinaison de modifications de code permettant cette méthode de transmission en continu de documents PDF, Excel ou Word lorsque le ' Ne pas enregistrer les pages cryptées sur disque L'option est activée.

Microsoft a déclaré que ce problème était inhérent à la conception de nombreux articles de la Base de connaissances et courriers électroniques privés. Il semble que lorsque l'option " Ne pas enregistrer les pages cryptées sur le disque " est activée, IE se comporte correctement et fait ce qu'il est censé faire. Cet article est la meilleure ressource que j'ai trouvée jusqu'à présent explique pourquoi ce paramètre serait activé et le pour et le contre de l'activer:

  
    
      

" Le ' Ne pas enregistrer les pages cryptées sur le disque ' entre en jeu lorsqu'il s'agit de connexions SSL (HTTPS). Tout comme un serveur Web peut envoyer des informations sur la mise en cache d’un fichier, Internet Explorer peut ne pas enregistrer les fichiers dans le cache lors d’une connexion SSL (HTTPS), que le serveur Web vous le demande ou pas.

             

Quel est l'avantage de l'activation de cette fonctionnalité, la sécurité est la principale raison pour laquelle elle est activée. Les pages ne sont pas stockées dans le cache des fichiers Internet temporaires.

             

Quel est l'inconvénient? Performances lentes, car rien n'est enregistré dans le cache, même si une image gif sur un octet utilisée une douzaine de fois sur la page doit être récupérée à partir du serveur Web à chaque fois. Pour aggraver les choses, certaines actions de l'utilisateur peuvent échouer, telles que la suppression des fichiers téléchargés, la présentation d'une erreur ou encore l'ouverture de documents PDF, plusieurs scénarios à ne pas décrire. "

    
  

La meilleure solution que nous puissions trouver à ce stade consiste à informer nos clients et utilisateurs qu'il existe des alternatives à l'utilisation de ce paramètre:

  
    
      

"Utilisez le dossier" Vider les fichiers Internet temporaires lorsque le navigateur est fermé ". Chaque fois que le navigateur se ferme, tous les fichiers sont purgés du cache en supposant qu'il n'y ait pas de verrou sur un fichier provenant d'une autre instance du navigateur ou d'une application externe.

             

Avant d'utiliser " Ne pas enregistrer les pages cryptées sur le disque ", vous devez tenir compte de nombreuses considérations. Cela ressemble à une fonctionnalité de sécurité exceptionnelle, mais les résultats de son utilisation peuvent entraîner une augmentation des appels du support technique en cas d'échec du téléchargement ou de ralentissement des performances. "

    
  

Autres conseils

Votre en-tête Cache-Control est incorrect. Il devrait s'agir de Cache-Control: max-age = 1 avec le tiret au milieu. Essayez de corriger cela en premier pour voir si cela fait une différence.

En règle générale, je dirais que le principal responsable est votre en-tête Vary, qui pose souvent des problèmes de mise en cache dans IE: http://blogs.msdn.com/ieinternals/archive/2009/06/17/9769915.aspx . Vous voudrez peut-être ajouter un ETAG aux en-têtes de réponse.

Fiddler ne devrait pas avoir d’impact sur la possibilité de mise en cache (à moins que vous n’ayez écrit de règles), et il semblerait que vous disiez cela, ce qui suggère qu’il existe peut-être un problème de synchronisation.

> Ne pas enregistrer les pages cryptées sur l'option de sécurité du disque désactivée par défaut

Cette option est toujours désactivée par défaut (dans IE6, 7 et 8), bien que les administrateurs informatiques puissent l'activer via la stratégie de groupe, ce que certaines grandes entreprises font de même.

Incidemment, si vous voyez l'erreur de certificat lors de l'exécution de Fiddler, c'est que vous n'avez pas choisi de faire confiance au certificat racine Fiddler. voir http://www.fiddler2.com/fiddler/help/httpsdecryption.asp pour plus d'informations sur ce sujet.

J'ai eu un problème similaire avec les fichiers PDF que je voulais diffuser. Même avec Response.ClearHeaders () , des en-têtes Pragma et Cache-Control ont été ajoutés au moment de l'exécution. La solution consistait à effacer les en-têtes dans IIS (Cliquez avec le bouton droit de la souris sur> Propriétés dans la page de chargement du PDF, puis sur l’onglet "En-têtes HTTP").

J'ai constaté que cela semblait fonctionner pour moi:

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

RESOLU: C’est un problème d’IE, pas d’application ... corrigez-le avec ceci: http://support.microsoft.com/kb/323308 Cela fonctionne parfaitement pour moi, après avoir essayé pendant longtemps.

ATT: Mr.Dark

Nous sommes confrontés à un problème similaire il y a longtemps - ce que nous avons fait, c’est nous (c’est Java EE). Dans la configuration de l'application Web, nous ajoutons

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

Ainsi, tout fichier PDF provenant de votre application Web sera téléchargé à la place du navigateur qui tente de générer le rendu.

MODIFIER : on dirait que vous le diffusez en streaming. Dans ce cas, vous utiliserez un type mime comme application / octet-stream dans votre code et non dans la configuration. Alors ici, au lieu de

Response.ContentType = "application/pdf"

vous utiliserez

Response.ContentType = "application/octet-stream"

Quelle version d'IE? Je me souviens que Microsoft a publié un correctif pour IE6 pour ce problème. Espérons-nous que cela soit utile?

Je lis votre chasse à l'oie contrôlée par le cache, mais je vais partager qui répondait à mes besoins , au cas où cela aiderait.

essayez de désactiver la compression gzip.

L'ajouter ici en espérant que quelqu'un trouvera cela utile à la place en passant par les liens.

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

Comme pour le PO, je me suis gratté la tête pendant des jours pour essayer de faire fonctionner cela, mais je l’ai fait à la fin et j’ai donc pensé partager ma "combinaison" d’en-têtes:

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

J'espère que cela sauvera de la douleur à quelqu'un quelque part!

Je rencontrais un problème similaire lorsque je tentais de diffuser un fichier PDF via SSL et de le placer dans un iframe ou un objet. Je découvrais que ma page aspx continuerait à être redirigée vers la version non sécurisée de l'URL et que le navigateur la bloquerait.

J'ai constaté que le passage d'une page ASPX à un gestionnaire ASHX corrigeait mon problème de redirection.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top