Conexão sendo fechada ao tentar enviar um arquivo zip grande
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?
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.