2012-03-07 9 views
6

Así que estoy devolviendo un FileContentResult de una acción como esta:"Archivo no se pudo descargar" en Internet Explorer con ASP.NET MVC

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

Al hacer clic en "Abrir" en el IE (soy utilizando IE9, versión 9.0.8112.16421), dice "El archivo no se pudo descargar" y se le presenta al usuario un botón "Volver a intentar". Si hacen clic en Reintentar, funciona bien. Si hacen clic en Guardar, funciona bien. En Firefox, funciona bien.

¿Cómo puedo permitir que el usuario abra el archivo cuando el clic abra la primera vez?

+0

qué versión de decir? – Joe

+0

He actualizado la pregunta. –

+0

Instala el violín y hazlo funcionar cuando realices la primera solicitud. Podrá inspeccionar la respuesta del servidor. Quizás eso arroje algo de luz sobre el tema. http://www.fiddler2.com/fiddler2/ – Joe

Respuesta

2

Pude "engañar" a IE para que hiciera lo correcto modificando la URL. Es un poco hacky, pero aquí está el detalle. HTH.

Como un buen codificador de MVC, utilicé Url.Action() para generar el enlace correcto en mi vista a la acción de mi controlador. El resultado fue "/ Subscription/DownloadArchive", y tuve el mismo problema. (Estoy transmitiendo un archivo ZIP, pero parece que no es diferente de tu CSV). Por un momento, después de leer tu publicación, codifiqué la URL como "/Subscription/DownloadArchive/Archive.zip". Ignoro el código "Archive.zip", pero ese es, de hecho, el nombre del archivo que devuelvo de la acción de mi controlador.

Presto!

0

Tuve el mismo problema pero si cambié el número de puerto de Visual Studio Development Server a otro, entonces este problema desapareció.

2

Tengo el mismo problema y no puedo ofrecer una buena solución (además de lo que sugiere Tood, que es una opción). Pero mirando la situación con el violín & co., Tengo algo más de información que puede ser de ayuda.

Nuestra aplicación está creando documentos PDF sobre la marcha y los ofrece como descargas. El problema es claramente dependiente de los datos, lo que significa que algunos archivos generados se descargan bien en el primer intento, mientras que otros reproduciblemente necesitan el reintento.

Fiddler muestra que las respuestas del servidor son idénticas en cada acceso, por lo que puedo ver. Las solicitudes difieren, sin embargo (muestras con pequeñas modificaciones):

Primera solicitud:

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 

segunda petición:

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, cómo la segunda solicitud reduce el 'Accept:' cabecera a poco */*. La razón por la que soy reacio a agregar una extensión de archivo a la Url es que el nombre de descarga sugerido se genera a partir de los datos del artículo, se envía con la respuesta y no está relacionado con la ID.

+0

Eh, eso es muy interesante. Tendré que volver a esto y echar un segundo vistazo. –

+0

Me encontré con el mismo problema con IE 11. Veo los mismos resultados en Fiddler. Mi proceso fue abrir un archivo de texto del sistema local y editarlo o crear uno desde cero. La mejor solución que se me ocurrió fue agregar una marca de tiempo al nombre del archivo como 'filename.timestamp.txt' y funcionó bien después de eso. – JabberwockyDecompiler

0

esto funciona ..

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