Я пытаюсь разрешить пользователям загружать несколько файлов из приложения silverlight.Для этого я решил использовать библиотеку DotNetZip
и обработчик ASP.NET
, которые позаботятся о получении всех файлов из базы данных и их отправке клиенту.Это казалось хорошей идеей и легко осуществимо.Я создал простой обработчик, написал весь необходимый код, и все заработало.
Однако по какой-то причине, когда я создаю zip-файл со многими файлами, возникает проблема.The remote host closed the connection. The error code is 0x800704CD.
Исключение выдается, когда я пытаюсь записать данные в Response
.
Private Sub MultipleFileDownload_Loaded(sender As Object, e As EventArgs) Handles Me.Load
// initialize data and stuff
_context.Response.Clear()
_context.Response.BufferOutput = False
Me.ZipElementsIntoOutputStream(elementsToDownload)
_context.Response.End()
End Sub
Private Sub ZipElementsIntoOutputStream(elements As List(Of ElementImageFile))
_context.Response.ContentType = "application/zip"
Dim archiveName As String = String.Format("archive-{0}.zip", DateTime.Now.ToString("yyyy-MM-dd-HHmmss"))
_context.Response.AddHeader("content-disposition", "attachment; filename=" + archiveName)
Using zip As New ZipFile()
For Each elementToDownload In elements.Where(Function(e) e IsNot Nothing AndAlso e.File IsNot Nothing)
Dim fileName = Me.GetUniqueFileName(elementToDownload, zip)
zip.AddEntry(fileName, elementToDownload.File)
Next
Using s As IO.MemoryStream = New IO.MemoryStream()
zip.Save(s)
s.Seek(0, IO.SeekOrigin.Begin)
Dim buffer(10000) As Byte
Dim length As Integer
Dim dataToRead As Long
dataToRead = s.Length
While dataToRead > 0
If (Me._context.Response.IsClientConnected) Then
length = s.Read(buffer, 0, 10000)
Me._context.Response.OutputStream.Write(buffer, 0, length)
Me._context.Response.Flush()
ReDim buffer(10000)
dataToRead = dataToRead - length
Else
dataToRead = -1
End If
End While
'zip.Save(_context.Response.OutputStream)
End Using
End Using
End Sub
Как вы можете видеть, я создаю MemoryStream
и отправляю небольшие фрагменты данных в Response
, так какЯ видел, что это показало решение похожих проблем, но это не помогло.Сохранение файла Zip
непосредственно в Response
вызывает у меня точно такую же ошибку.
BufferOutput
свойство имеет значение False
, поэтому оно немедленно начнет загрузку, но изменение его на True
не даетизмените что-либо.
Файл zip
, который я пытаюсь отправить, имеет размер около 248 мегабайт, и это дает мне ошибку.Когда я удаляю некоторые элементы и файл zip
занимает около 220 мегабайт, кажется, что все работает нормально.
Кто-нибудь знает, что может быть причиной такого поведения?Как я могу это исправить, поэтому отправка zip-файлов не даст мне этой ошибки?