Tip: Exportacion hacia Excel bajo SSL
Estuvimos realizando un trabajo de exportación de datos hacia Excel, todo iba de mi maravillas era el típico modo de exportación que se maneja de la siguiente manera:
| response.Clear(); |
| response.Buffer = true; |
| //Tipo Excel |
| response.ContentType = "application/vnd.ms-excel"; |
| //Attachment para que aparesca el cuadrito de guardar como |
| response.AppendHeader("content-disposition", "attachment; filename=" + strNombreArchivo); |
| MemoryStream stream = new MemoryStream(); |
| XmlTextWriter writer = new XmlTextWriter(stream, Encoding.UTF8); |
| CreateStylesheet(writer, sHeaders, sFileds, FormatType); |
| writer.Flush(); |
| stream.Seek(0, SeekOrigin.Begin); |
| //dsExportar es la data a exportar, en este caso un DataSet |
| XmlDataDocument xmlDoc = new XmlDataDocument(dsExportar); |
| XslTransform xslTran = new XslTransform(); |
| xslTran.Load(new XmlTextReader(stream), null, null); |
| System.IO.StringWriter sw = new System.IO.StringWriter(); |
| xslTran.Transform(xmlDoc, null, sw, null); |
| response.Write(sw.ToString()); |
| sw.Close(); |
| writer.Close(); |
| stream.Close(); |
| response.End(); |
El código que se muestra es estandar, no hay nada de especial, todo funcionaba de mil maravillas excepto que al hacer pruebas sobre SSL y en especial en
Internet Explorer v 6.0 SP 1 (Si, la misma versión que me dió un monton de problemas para ASP.NET Ajax), simplemente el reporte no se generaba, lanzándonos el siguiente mensaje de error:
"No puede descargar ...Pagina.aspx de www.website.com.
Internet Explorer no puede abrir este sitio Internet. El sitio pedido no está disponible o no se encuentra. Inténtelo de nuevo."
Luego de investigar un poco respecto al tema nos encontramos que se debía a un bug dentro del navegador y era referente al manejo del Cache y SSL.
El manejo del cache que tenía estaba generando inconvenientes al momento de intentar descargar el archivo excel desde la zona segura, y era especialmente por una de las cabeceras agregadas: ’Pragma: no-cache’
En si la solución es muy sencilla y consiste en quitar esta cabecera al momento de realizar la exportación y luego si queremos que cada vez que se descargue un archivo sea una nueva versión del mismo podríamos usar la siguiente cabecera: "Cache-Control: max-age=0" con ello nos aseguramos de obtener la última versión de la exportación :).
Ahora en código C# quedaría algo como lo siguiente (Primero limpiamos los headers y luego agregamos la directiva antes definida):
| response.Clear(); |
| response.ClearHeaders(); |
| response.ClearContent(); |
| response.AddHeader("Cache-Control", "max-age=0"); |
Ahora ya tenemos exportando correctamente la información bajo SSL y en Internet Explorer 6.0 SP 1
Espero sea de utilidad,
Ivan Mostacero.