2012-08-23 22 views
5

Tengo un archivo ashx con un IHttpHandler. Cuando publico algunos datos en este IHttpHandler, trabajo un poco, creo un archivo y luego quiero que ese archivo se devuelva al usuario para que pueda guardarlo a través de su navegador.Escribir archivo en HttpResponse, el navegador no solicita guardar

Con el archivo creado, esta es la forma en que intento escribir el archivo de nuevo a la respuesta:

HttpResponse response = context.Response; 
response.ClearContent(); 
response.Clear(); 
response.ContentType = "application/octet-stream"; 
response.AddHeader("Content-Disposition", "attachment; filename=MYFILE.EXT"); 
response.WriteFile("C:\tempstuff\MYFILE.EXT"); 

En un bloque finally más adelante, llamaré:

response.End() 

Cuando llama a este controlador, no pasa nada. Se devuelve la respuesta 200, no se generan errores, pero el navegador no solicitará al usuario que guarde este archivo.

Esto es lo que la respuesta, como se recoge en Fiddler, se ve así:

HTTP/1.1 200 OK 
Server: ASP.NET Development Server/10.0.0.0 
Date: Thu, 23 Aug 2012 12:12:19 GMT 
X-AspNet-Version: 4.0.30319 
Content-Disposition: attachment; filename=MYFILE.EXT 
Cache-Control: private 
Content-Type: application/octet-stream 
Content-Length: 781053 
Connection: Close 

[raw content of the file here] 

Esta respuesta parece correcto para mí. Contiene el contenido del archivo; sin embargo, en ninguno de los principales navegadores, ningún diálogo de archivo me pide que guarde el archivo.

¿Qué estoy haciendo mal aquí?

Actualización: En caso de que ayude, aquí es donde estoy usando JavaScript desde mi aplicación web para llamar a este HttpHandler.

$.ajax({ 
    type: 'POST', 
     url: ashxUrl, 
     data: postData, 
     success: function (result) { 
      // Doin' stuff on success 
     }, 
     error: function (error) { 
      // Doin' stuff on error. 
     } 
}); 
+0

Intenté exactamente lo mismo. Hice una página simple 'Download.ashx' con el código de arriba, y la PUBLICÉ desde otra página,' Default.aspx'. En los tres navegadores (IE, FF, Chrome), funciona perfectamente, y obtengo casi los mismos encabezados en Fiddler. ¿No estoy seguro de qué más podría estar pasando? – mellamokb

+0

¡Interesante! Tal vez sería útil describir mi JavaScript, donde estoy haciendo explícitamente esta solicitud de llamada. Editaré la publicación principal para incluir este fragmento. EDITAR: agregué el fragmento de JS. –

+6

Ah. Sí, eso ayuda. No puede hacer una [descarga de archivos a través de AJAX] (http://stackoverflow.com/questions/4814877/how-to-download-file-via-ajax-with-http-post-ie-some-info-in -cuerpo). Necesitará una solución alternativa [como esta] (http://stackoverflow.com/questions/3499597/javascript-jquery-to-download-file-via-post-with-json-data). – mellamokb

Respuesta

2

Usted ha dicho que desea que los resultados de la web llamada a estar disponibles para su javascript. Sería extremadamente molesto si eso causara que el navegador le pida que lo guarde, ya que entonces todo AJAX sería imposible.

desea que el propio navegador para realizar la llamada. Para un GET que sería una simple cuestión de configuración self.location.href. Para un POST la forma más fácil es normalmente completar un formulario oculto con los datos, y luego submit().

Cuestiones relacionadas