Asp.net 尝试发送大型zip文件时连接关闭
我试图实现的是允许用户从silverlight应用程序下载多个文件。为此,我决定使用Asp.net 尝试发送大型zip文件时连接关闭,asp.net,ashx,dotnetzip,Asp.net,Ashx,Dotnetzip,我试图实现的是允许用户从silverlight应用程序下载多个文件。为此,我决定使用DotNetZip库和ASP.NET处理程序来处理从数据库获取所有文件并将它们发送到客户端。这似乎是个好主意,而且易于实施。我已经创建了一个简单的处理程序,编写了所有需要的代码,并且一切正常 然而,由于某些原因,当我用许多文件创建zip文件时,出现了一个问题远程主机已关闭连接。错误代码为0x800704CD。当我尝试将数据写入响应时引发异常 Private Sub MultipleFileDownload_Loa
DotNetZip
库和ASP.NET
处理程序来处理从数据库获取所有文件并将它们发送到客户端。这似乎是个好主意,而且易于实施。我已经创建了一个简单的处理程序,编写了所有需要的代码,并且一切正常
然而,由于某些原因,当我用许多文件创建zip文件时,出现了一个问题<代码>远程主机已关闭连接。错误代码为0x800704CD。当我尝试将数据写入响应时引发异常
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文件不会出现此错误?事实证明,问题不在DotNetZip
和ASHX
处理程序中。问题出在传递给此处理程序的很长查询字符串中<代码>Internet Explorer
最多可以处理查询字符串中的2048个字符。不幸的是,我传递了更长的字符串
IE
没有给我某种错误来指示问题,而是创建了到服务器的连接,没有等待我的响应,而是立即关闭了连接,这是我出现问题的原因
修复了查询字符串长度问题,也修复了此行为,现在下载更大的文件可以正常工作