Если сравнить адаптации кода с версией, представленной в MSDN page вы увидите, что ZipArchiveMode.Create никогда не используется, то, что используется ZipArchiveMode.Update.
Несмотря на это, основной проблемой является OutputStream, который не поддерживает чтение и Seek, которая необходима в ZipArchive в режиме обновления:
Когда вы установите режим обновления, то базовый файл или поток должен поддержка чтения, письма и поиска. Содержимое всего архива хранится в памяти, и никакие данные не записываются в основной файл , пока архив не будет удален.
Source: MSDN
Вы не получали каких-либо исключений с режимом создания, потому что нужно только написать:
Когда вы установите режим Create, основной файл или поток должен поддерживать но не нуждается в поддержке поиска. Каждая запись в архиве может быть открыта только один раз для записи. Если вы создаете одну запись, данные записываются в базовый поток или файл, как только он будет доступен. Если вы создаете несколько записей, например, вызывая метод CreateFromDirectory, данные записываются в базовый поток или файл после создания всех записей.
Source: MSDN
Я считаю, что вы не можете создать почтовый файл непосредственно в OutputStream, так как это сетевой поток и искать не поддерживается:
Streams может поддерживать поиск. Поиск означает запрос и изменение текущей позиции в потоке. Возможность поиска зависит от типа хранилища резервных копий, которое имеет поток. Например, сетевые потоки не имеют единой концепции текущей позиции и, как правило, не поддерживают поиск.
Альтернатива может быть записана в поток памяти, а затем использовать метод OutputStream.Write для отправки zip-файла.
MemoryStream ZipInMemory = new MemoryStream();
using (ZipArchive UpdateArchive = new ZipArchive(ZipInMemory, ZipArchiveMode.Update))
{
ZipArchiveEntry Zipentry = UpdateArchive.CreateEntry("filename.txt");
foreach (ZipArchiveEntry entry in UpdateArchive.Entries)
{
using (StreamWriter writer = new StreamWriter(entry.Open()))
{
writer.WriteLine("Information about this package.");
writer.WriteLine("========================");
}
}
}
byte[] buffer = ZipInMemory.GetBuffer();
Response.AppendHeader("content-disposition", "attachment; filename=Zip_" + DateTime.Now.ToString() + ".zip");
Response.AppendHeader("content-length", buffer.Length.ToString());
Response.ContentType = "application/x-compressed";
Response.OutputStream.Write(buffer, 0, buffer.Length);
EDIT: С обратной связью от комментариев и дальнейшего чтения, можно создавать большие Zip-файлы, так что поток памяти может вызвать проблемы.
В этом случае я предлагаю вам создать zip-файл на веб-сервере, а затем вывести файл с помощью Response.WriteFile.
вы пытаетесь использовать его в среде разработки или сервере – Alok
В настоящее время я запускаю его локально, поэтому среда разработки. Я получаю HttpContext от IHttpHandler. –
ОК, MVC или веб-формы? – Alok