2010-02-02 3 views
0

J'ai une action de contrôleur qui renvoie un document pdf. En fonction d'une variable de changement de site, il choisira l'un des nombreux fichiers sources, le renommera et le renverra au navigateur. Cela fonctionne parfaitement sur Chrome et Firefox, mais, sur IE8, la boîte de dialogue de téléchargement apparaît, puis le messagebox d'erreur suivant ...ASP.Net MVC FilePathResult Échec dans IE

« Internet Explorer ne peut pas télécharger FullTermsAndConditions de www.mydomain.com.

Internet Explorer n'a pas pu ouvrir le site Internet Le site demandé est indisponible ou ne peut pas être trouvé . Veuillez réessayer plus tard. "

Ceci est mon code ...

public ActionResult FullTermsAndConditions() 
{ 
    var targetFileName = LookupTargetFileName(); 
    var fullPath = System.IO.Path.Combine(DownloadsPath, LookupSourceFileName()); 
    var result = File(fullPath, "application/pdf"); 
    result.FileDownloadName = targetFileName; 

    return result; 
} 

Quelqu'un peut-il voir ce que j'ai fait de mal?


Informations complémentaires ...

j'ai ajouté le code suivant à mon contrôleur pour afficher les en-têtes ...

protected override void OnResultExecuted(ResultExecutedContext filterContext) 
{ 
    base.OnResultExecuted(filterContext); 

    WriteResponseHeadersToFile(@"C:\temp\ResponseHeaders.txt", filterContext.HttpContext.Response); 
} 

private static void WriteResponseHeadersToFile(string fileName, System.Web.HttpResponseBase response) 
{ 
    using (StreamWriter writer = new StreamWriter(fileName, true)) 
    { 
    writer.Write("Reponse started @ "); 
    writer.WriteLine(DateTime.Now.ToShortTimeString()); 

    var allHeaders = response.Headers; 

    for (int i = 0; i < allHeaders.Count; i++) 
     writer.WriteLine("{0} = {1}", allHeaders.Keys[i], allHeaders[i]); 

    writer.Close(); 
    } 
} 

Ce fut le résultat ...

Réponse démarrée @ 09:02
Serveur = Microsoft-IIS/7.0
X-AspNetMvc-Version = 1.0
Content-Disposition = pièce jointe; filename = "Termes et conditions complets.pdf"

+0

Qu'est-ce que 'targetFileName'? Et pouvez-vous afficher les en-têtes de réponse HTTP générés par 'FullTermsAndConditions()'? – bzlm

+0

targetFileName sera 'FullTermsAndConditions.pdf' et est le nom que les utilisateurs verront lors du téléchargement. Pouvez-vous me donner une méthode pour vérifier les en-têtes s'il vous plaît? –

+0

La question principale a maintenant plus d'informations. –

Répondre

0

Succès!

Le problème est lié à la mise en cache côté client. L'une de mes classes de contrôleur parent avait le code suivant (pour tenter d'empêcher un utilisateur d'aller « retour » une fois déconnecté) ...

protected override void OnResultExecuted(ResultExecutedContext filterContext) 
{ 
    base.OnResultExecuted(filterContext); 

    Response.Buffer = true; 
    Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    Response.ExpiresAbsolute = DateTime.Now.AddDays(-1d); 
    Response.Expires = -1500; 
    Response.Cache.SetETag(DateTime.Now.Ticks.ToString()); 
} 

Si, dans IE8, le fichier que vous téléchargez ne peut pas être ouvert dans le navigateur, il tentera d'enregistrer une copie temporaire. Ceci est en violation de l'en-tête no-cache. Retrait de cet en-tête résout le problème.

+3

http://blogs.msdn.com/ieinternals/archive/2009/10/02/Internet-Explorer-cannot-download-over-HTTPS-when-no-cache.aspx – EricLaw

+0

Voici la version de l'article kb: http: //support.microsoft.com/kb/316431 –