2 cosas. Primero, si conserva el diseño del código que tiene, debe realizar una Búsqueda() en el MemoryStream antes de escribirlo en la entrada.
dt.TableName = "Declaration";
MemoryStream stream = new MemoryStream();
dt.WriteXml(stream);
stream.Seek(0,SeekOrigin.Begin); // <-- must do this after writing the stream!
using (ZipFile zipFile = new ZipFile())
{
zipFile.AddEntry("Report.xml", "", stream);
Response.ClearContent();
Response.ClearHeaders();
Response.AppendHeader("content-disposition", "attachment; filename=Report.zip");
zipFile.Save(Response.OutputStream);
}
Incluso si se mantiene este diseño, sugeriría el uso de una cláusula(), como he mostrado, y como se describe en toda la DotNetZip examples, en lugar de llamar a Dispose(). La cláusula using() es más confiable ante fallas.
Ahora puede preguntarse, ¿por qué es necesario buscar en el MemoryStream antes de llamar a AddEntry()? El motivo es que AddEntry() está diseñado para admitir a los llamantes que pasan una transmisión donde la posición es importante. En ese caso, la persona que llama necesita que los datos de entrada se lean de la secuencia, usando la posición actual de la corriente. AddEntry() lo admite. Por lo tanto, establezca la posición en la secuencia antes de llamar AddEntry().
Pero, la mejor opción es modificar su código para usar el overload of AddEntry() that accepts a WriteDelegate. Fue diseñado específicamente para agregar conjuntos de datos en archivos zip. Su código original escribe el conjunto de datos en una secuencia de memoria, luego busca en la secuencia y escribe el contenido de la secuencia en el archivo zip. Es más rápido y más fácil si escribe los datos una vez, que es lo que WriteDelegate le permite hacer. El código se ve así:
dt.TableName = "Declaration";
Response.ClearContent();
Response.ClearHeaders();
Response.ContentType = "application/zip";
Response.AppendHeader("content-disposition", "attachment; filename=Report.zip");
using(Ionic.Zip.ZipFile zipFile = new Ionic.Zip.ZipFile())
{
zipFile.AddEntry("Report.xml", (name,stream) => dt.WriteXml(stream));
zipFile.Save(Response.OutputStream);
}
Esto escribe el conjunto de datos directamente en la secuencia comprimida en el archivo zip. ¡Muy eficiente! Sin doble buffer. El delegado anónimo se llama en el momento de ZipFile.Save(). Solo se realiza una escritura (+ compresión).
Entonces, ¿qué bit no funciona entonces? :) – Rob
el archivo xml en el archivo zip está vacío. –