Соединение закрывается при попытке отправить большой zip-файл - PullRequest
0 голосов
/ 25 января 2012

Я пытаюсь разрешить пользователям загружать несколько файлов из приложения 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-файлов не даст мне этой ошибки?

1 Ответ

0 голосов
/ 27 января 2012

Как оказалось, проблема была не в DotNetZip, а в ASHX обработчике.Проблема была в очень длинной строке запроса, переданной этому обработчику.Internet Explorer может обрабатывать до 2048 символов в строке запроса.И, к сожалению, я передал более длинную строку.

IE вместо того, чтобы дать мне какую-то ошибку, чтобы указать на проблему, создал соединение с сервером и не дождался моего ответа, но немедленно закрыл соединение, которое было причиноймои проблемы.

Исправлена ​​проблема с длиной строки запроса, также исправлено это поведение, и теперь загрузка больших файлов работает правильно.

...