Estoy haciendo pruebas con HttpHandler de ASP.NET para descargar un archivo escribiendo directamente en la secuencia de respuesta, y no estoy muy seguro de la forma en que lo estoy haciendo. Se trata de un método de ejemplo, en el futuro, el archivo puede ser almacenado en un BLOB en la base de datos:Algunas preguntas sobre escribir en la corriente de respuesta ASP.NET
public void GetFile(HttpResponse response)
{
String fileName = "example.iso";
response.ClearHeaders();
response.ClearContent();
response.ContentType = "application/octet-stream";
response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName);
using (FileStream fs = new FileStream(Path.Combine(HttpContext.Current.Server.MapPath("~/App_Data"), fileName), FileMode.Open))
{
Byte[] buffer = new Byte[4096];
Int32 readed = 0;
while ((readed = fs.Read(buffer, 0, buffer.Length)) > 0)
{
response.OutputStream.Write(buffer, 0, readed);
response.Flush();
}
}
}
Pero, no estoy seguro de si esto es correcto o hay una mejor manera de hacerlo. Mis preguntas son:
- Al abrir la URL con el navegador, aparece el cuadro de diálogo "Guardar archivo" ... pero parece que el servidor ha comenzado ya a enviar datos en la corriente antes de que haga clic en "Guardar ", ¿eso es normal?
- Si elimino la línea "response.Flush()", cuando abro la URL con el navegador, ... veo cómo el servidor web está presionando datos pero no aparece el cuadro de diálogo "Guardar archivo", (o al menos no de manera razonable) ¿por qué?
- Cuando abro la url con un objeto WebRequest, veo que HttpResponse.ContentLength es "-1", aunque puedo leer la secuencia y obtener el archivo. ¿Cuál es el significado de -1? ¿Cuándo va HttpResponse.ContentLength a mostrar la duración de la respuesta? Por ejemplo, tengo un método que recupera un gran xml comprimido con desinflar como una secuencia binaria, pero en ese caso ... cuando accedo a él con una WebRequest, en HttpResponse puedo ver la longitud del contenido con la longitud de la secuencia , ¿por qué?
- ¿Cuál es la longitud óptima para la matriz Byte [] que uso como buffer para un rendimiento óptimo en un servidor web? He leído que está entre 4K y 8K ... pero qué factores debería considerar para tomar la decisión correcta.
- ¿Influye este método en el uso de la memoria de IIS o del cliente? ¿o está realmente almacenando en búfer la transferencia correctamente?
Lo siento por tantas preguntas, soy bastante nuevo en el desarrollo web: P
Saludos.
También debería echar un vistazo a las implementaciones de Boilerplate HttpHandler aquí (http://haacked.com/archive/2005/03/17/AnAbstractBoilerplateHttpHandler.aspx) y aquí (http://www.hanselman.com /blog/PermaLink,guid,5c59d662-b250-4eb2-96e4-f274295bd52e.aspx). – R0MANARMY
Se aprecia su forma de aprender. Sigue adelante . –
Esto funcionará: [http://stackoverflow.com/questions/3362849/outofmemoryexception-when-send-big-file-500mb-using-filestream-aspnet][1] [ 1]: http://stackoverflow.com/questions/3362849/outofmemoryexception-when-send-big-file-500mb-using-filestream-aspnet –