2010-02-23 4 views
1

J'ai une application ASP.net qui renvoie un fichier PDF binaire (stocké à partir de la base de données, qui a été précédemment téléchargé) au client.Comment afficher la pièce jointe PDF dans IE6

Le code que j'ai fonctionne très bien pour tous les navigateurs, sauf Internet Explorer 6 (histoire de ma vie!). Dans IE6, lorsqu'un utilisateur clique sur "ouvert", Adobe signale l'erreur suivante: "Une erreur s'est produite lors de l'ouverture de ce document." Impossible de trouver le fichier. " Lorsque l'utilisateur clique sur Enregistrer, le PDF enregistre bien et peut être ouvert en double-cliquant dessus. Je suis perplexe. Google a donné des suggestions de mise en cache (définition de cachecontrol à private etc) et j'ai essayé tout cela mais rien n'a fonctionné. Le comportement wierd (er) est quand je génère un PDF dans ma couche serveur ASP. Net (en utilisant NFop) à partir de zéro, IE l'ouvrira bien (en utilisant le même code!).

Voici mon code pour envoyer les données binaires à travers le fil:

// Firefox doesn't like spaces in filenames. 
    filename = filename.Replace(" ", "_"); 

    string extension = Path.GetExtension(filename); 

    string contentType; 

    switch (extension) 
    { 
     case "pdf": 
      contentType = "application/pdf"; 
      break; 
     default: 
      contentType = "application/x-unknown"; 
      break; 
    } 

    context.Response.Clear(); 
    context.Response.AddHeader("content-disposition", "attachment;filename=" + filename); 
    context.Response.Charset = ""; 
    context.Response.ContentType = contentType; 
    context.Response.BinaryWrite(data); 
    context.Response.Flush(); 

Voici les versions d'application:

  • 3.5 ASP .net
  • IE6.0.2900.2180.xpsp_s
  • Article de liste
  • p2_gdr.091208-2028
  • Adobe Reader 8.0.0 Version
  • Windows XP SP 2
  • SQL Server 2008

Toute aide/suggestions serait très apprécié. Merci :)

EDIT:

J'ai branché Fiddler pour voir les en-têtes et il ne suffit que semble être un problème de mise en cache. Grrr!

Lorsque mon PDF NFop (celui qui fonctionne) est téléchargé, il envoie cache-control = private. Lorsque ma pièce jointe PDF (celle qui ne fonctionne pas) est téléchargée, elle envoie un non-cache.

J'ai regardé dans l'objet Response et les deux semblent avoir les mêmes en-têtes quand j'appelle context.Response.Flush().

Toujours perplexe!

SOLVED:

Quelque part dans notre cadre était une méthode escroc qui a été invoquée par réflexion:

/// /// Définit le expiratoin de la demande et la force ne cache /// protected void SetCacheExpiration (Contexte HttpContext) { // définit le cache pour qu'il expire immédiatement context.Response.Cache.SetCacheability (HttpCacheability.NoCache); context.Response.Cache.SetSlidingExpiration (true); context.Response.Cache.SetExpires (DateTime.Now); context.Response.Cache.SetMaxAge (new TimeSpan (0, 0, 0)); context.Response.Cache.SetNoStore(); context.Response.Cache.SetAllowResponseInBrowserHistory (false); context.Response.Cache.SetValidUntilExpires (false); context.Response.Cache.SetRevalidation (HttpCacheRevalidation.AllCaches);

} 

Merci pour votre aide, mise en cache! Il est intéressant que le seul navigateur qui n'a pas réellement mis en cache le téléchargement (lorsqu'il est ouvert) était IE6.

+1

Vous devriez appeler 'Path.GetExtension (fileName)'. – SLaks

+0

Merci pour le pourboire! :) – Russell

+0

Notez que 'Path.GetExtension (fileName)' inclura le '.'. – SLaks

Répondre

0

Quelque part dans notre cadre était une méthode escroc qui a été invoquée par réflexion:

/// <summary> 
    /// Sets the expiratoin of the request and force no cache 
    /// </summary> 
    protected void SetCacheExpiration(HttpContext context) 
    { 
     //sets the cache to expire immediately 
     context.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     context.Response.Cache.SetSlidingExpiration(true); 
     context.Response.Cache.SetExpires(DateTime.Now); 
     context.Response.Cache.SetMaxAge(new TimeSpan(0, 0, 0)); 
     context.Response.Cache.SetNoStore(); 
     context.Response.Cache.SetAllowResponseInBrowserHistory(false); 
     context.Response.Cache.SetValidUntilExpires(false); 
     context.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); 

    } 

Merci pour votre aide, la mise en cache! Il est intéressant que le seul navigateur qui n'a pas réellement mis en cache le téléchargement (lorsqu'il est ouvert) était IE6.