Pergunta

O que estou tentando realizar é permitir que os usuários baixem vários arquivos do aplicativo Silverlight.Para fazer isso eu decidi usar DotNetZip biblioteca e ASP.NET manipulador que se encarregará de obter todos os arquivos do banco de dados e enviá-los ao cliente.Parecia uma boa ideia e fácil de implementar.Criei um manipulador simples, escrevi todo o código necessário e tudo funcionou.

No entanto, por algum motivo, quando crio um arquivo zip com muitos arquivos, ocorre um problema. The remote host closed the connection. The error code is 0x800704CD. exceção está sendo lançada quando tento gravar dados em 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

Como você pode ver, estou criando MemoryStream e enviar pequenos pedaços de dados para Response, como já vi mostrado como solução para problemas semelhantes, mas isso não ajudou.Salvando Zip arquivo diretamente para Response está me dando exatamente o mesmo erro.

BufferOutput propriedade está definida como False então ele iniciaria o download imediatamente, mas alterando-o para True não muda nada.

O zip O arquivo que estou tentando enviar tem cerca de 248 megabytes e isso me dá um erro.Quando eu removo alguns elementos e zip arquivo tem cerca de 220 megabytes, tudo parece funcionar bem.

Alguém sabe qual pode ser o motivo desse comportamento?Como posso corrigir isso, para que o envio de arquivos zip não me dê esse erro?

Foi útil?

Solução

Acontece que o problema não estava em DotNetZip e ASHX manipulador.O problema estava em uma string de consulta muito longa passada para esse manipulador. Internet Explorer pode lidar com até 2.048 caracteres na string de consulta.E infelizmente passei uma corda mais longa.

IE em vez de me dar algum tipo de erro para indicar o problema, criei conexão com o servidor, e não esperei minha resposta, mas fechei imediatamente a conexão, o que foi a causa dos meus problemas.

A correção do problema de comprimento da string de consulta também corrigiu esse comportamento e agora o download de arquivos maiores funciona corretamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top