2012-03-07 5 views
6

Così sto tornando un FileContentResult da un'azione del genere:"Il file non può essere scaricato" in Internet Explorer con ASP.NET MVC

return File(pck.GetAsByteArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "MyExcelFile.xlsx"); 

Quando si clicca "Apri" in IE (io sono usando IE9, versione 9.0.8112.16421), si dice "File non può essere scaricato" e l'utente viene presentato con un pulsante 'Riprova'. Se fanno clic su Riprova, funziona correttamente. Se fanno clic su Salva, funziona correttamente. In Firefox, funziona bene.

Come posso consentire all'utente di aprire il file quando si fa clic su Apri la prima volta?

+0

quale versione di IE? – Joe

+0

Ho aggiornato la domanda. –

+0

Installa il fiddler e fallo funzionare quando esegui la prima richiesta. Sarai in grado di ispezionare la risposta proveniente dal server. Forse questo farà luce sul problema. http://www.fiddler2.com/fiddler2/ – Joe

risposta

2

Sono stato in grado di "ingannare" IE nel fare la cosa giusta modificando l'URL. È un po 'hacky, ma ecco i dettagli. HTH.

Come un buon codificatore MVC, ho utilizzato Url.Action() per generare il collegamento corretto nella mia vista per l'azione del mio controller. Il risultato è stato "/ Subscription/DownloadArchive", e ho avuto lo stesso problema. (Sto trasmettendo in streaming un file ZIP, ma non sembra diverso dal tuo CSV.) Per un capriccio ora, dopo aver letto il tuo post, ho hard-coded l'URL di "/Subscription/DownloadArchive/Archive.zip". Ignoro il file "Archive.zip" nel codice, ma questo è in realtà il nome del file restituito dall'azione del mio controller.

Presto!

0

Ho avuto lo stesso problema, ma se ho cambiato il numero di porta di Visual Studio Development Server a un altro, allora questo problema è scomparso.

2

Ho lo stesso problema e non riesco a offrire una buona soluzione (oltre a ciò che suggerisce Tood, che è un'opzione). Ma guardando la situazione con il violinista & co., Ho altre informazioni che potrebbero essere d'aiuto.

La nostra applicazione sta creando documenti PDF al volo e li offre come download. Il problema è chiaramente dipendente dai dati, il che significa che alcuni file generati scaricano bene al primo tentativo, mentre altri richiedono ripetutamente il tentativo.

Fiddler mostra le risposte del server per essere identiche su ogni accesso, per quanto posso dire. Le richieste divergono invece (campioni leggermente modificati):

Prima richiesta:

GET http://localhost:12345/Item/PDF/id HTTP/1.1 
Accept: text/html, application/xhtml+xml, */* 
Referer: ... 
Accept-Language: ... 
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0) 
Accept-Encoding: gzip, deflate 
Host: localhost:12345 
Connection: Keep-Alive 
Cookie: ASP.NET_SessionId=52znkt1fcisrolj44tnuyzu4 

Seconda richiesta:

GET http://localhost:12345/Item/PDF/id HTTP/1.1 
Accept: */* 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0) 
Host: localhost:12345 
Connection: Keep-Alive 
Cookie: ASP.NET_SessionId=52znkt1fcisrolj44tnuyzu4 

nota, come la seconda richiesta riduce il 'Accept:' intestazione da solo */*. La ragione per cui sono riluttante ad aggiungere un'estensione di file all'URL è che il nome del download suggerito è generato dai dati dell'articolo, inviati con la risposta e altrimenti totalmente estranei all'ID.

+0

Eh, questo è molto interessante. Dovrò tornare a questo e dare una seconda occhiata. –

+0

Ho incontrato lo stesso problema con IE 11. Vedo gli stessi risultati in Fiddler. Il mio processo consisteva nell'aprire un file di testo dal sistema locale e modificarlo o crearne uno da zero. La soluzione migliore che ho potuto venire con era di aggiungere un timestamp al nome del file come 'filename.timestamp.txt' e ha funzionato bene dopo. – JabberwockyDecompiler

0

questo funziona ..

Response.Clear(); 
Response.ClearHeaders(); 
Response.ClearContent(); 
Server.ScriptTimeout = 3000; 
Response.AppendHeader("Content-Disposition:", "attachment; filename=" + fileName); 
Response.ContentType = "application/x-msdownload"; 
excelFile.SaveXls(Response.OutputStream); 
Response.Flush(); 
HttpContext.Current.ApplicationInstance.CompleteRequest(); 
// Response.Close(); 
Response.End();