尝试发送大型zip文件时连接被关闭

时间:2012-01-25 17:58:26

标签: asp.net ashx dotnetzip

我想要完成的是允许用户从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 :(得分:0)

事实证明,问题不在DotNetZipASHX处理程序中。问题是传递给此处理程序的非常长的查询字符串。 Internet Explorer可以在查询字符串中处理最多2048个字符。不幸的是,我通过了更长的字符串。

IE而不是给我一些错误来指示问题,创建与服务器的连接,并且没有等待我的响应但是立即关闭连接,这是我的问题的原因。

修复查询字符串长度问题也修复了此行为,现在下载较大的文件也能正常工作。