编辑 - 解决:不同的是,在“主要”的情况下,下载是通过回调循环启动的,在“测试”的情况下,它是通过服务器端按钮启动的点击功能。我的猜测是下载请求和回调周期相互干扰,都会停止下载并导致页面变为非活动状态(如下所述)。当我在主页上重新下载了下载并开始提交而不是回叫时,它确实启动了下载。DotNetZip下载在一个网站上,而不是另一个
这是在VS2013旗舰版,Win7Pro,VB.Net,网站(不是项目),IISExpress。
我构建了一个测试站点来开发用于创建OpenXML PPTX和XLSX内存流的功能,并使用DotNetZip进行压缩和下载。知道它工作得很好。然后我将所有代码合并到我的“主”站点。这两个网站都在同一台机器上;我可以同时运行测试站点和主站点。主站点处理稍微复杂一些,但仅限于访问和下载更多文件。
但是,Zip和Download功能(下图)在测试网站中正常工作,但在主站点(无论是否有测试站点已启动并运行)中完全相同的代码不起作用。
在发生下载但没有错误显示的Zip.Save函数周围有一个错误陷阱(见下文)。
在Chrome,Firefox和IE11中具有相同的整体行为。
可能是一个线索的一个特点是,当主站点下载失败时,服务器端功能“失效”。本地JS功能正常工作,但该应用程序不响应回调。当我在浏览器上执行F5时,它会再次运行。
我在主站点的DotNetZip软件包上进行了刷新。 Zip对象似乎正常工作,因为它会在重复的文件名上产生错误。
我认为它可能是写入的下载功能,但是,它可以在测试网站上运行。另外,主站点的另一部分会对内存流进行非压缩下载(包含在下面的第二个代码块中),并且工作正常。
我认为这可能是数据。所以我扼杀了主要网站的访问权限,转换为内存流,并下载相同的文件,以便在测试网站中访问和下载。仍然主站点下载不起作用。
当我比较两个站点中的Zip对象上的手表值时,它们看起来完全相同。 wrkFS.ContentStream的长度在两种情况下都是相同的。文件名不同,但它们是: Test_2EFVG1THK5.xlsx(main) 6-18_12-46-28_0.xlsx(test) 这两个文件都是合法的文件名。
编辑:我从主程序保存ZIP文件保存到磁盘,而不是试图下载它,使用这样的:
wrkFilePath = "D:\filepath\test.zip"
wrkZip.Save(wrkFilePath)
它工作得很好。所以这可能是隔离问题这一说法
wrkZip.Save(context.Response.OutputStream)
编辑:此基础上帮助我在这里获得:
Convert DotNetZip ZipFile to byte array
我用这个结构:
Dim ms as New MemoryStream
wrkZip.Save(ms)
wrkBytes = ms.ToArray()
context.Response.BinaryWrite(wrkByteAr)
,以绕过ZipFile.Save(上下文),但也没有工作;没有下载,没有错误信息,页面死机。但是,至少我现在可以认为它不是ZipFile.Save的问题。
在这一点上我无法诊断问题。
任何建议,将不胜感激。
以下是在测试网站中工作但不在主网站中的代码。
Public Sub ZipAndDownloadMemoryStreams(ByVal context As HttpContext) _
Implements IHttpHandler.ProcessRequest
Dim rtn As String = ""
Try
Dim wrkAr As ArrayList
wrkAr = SC.ContentArrayForDownLoad
If wrkAr.Count = 0 Then
Dim wrkStop As Integer = 0
Exit Sub
End If
Dim wrkFS As ZipDownloadContentPair
Using wrkZip As New ZipFile
'----- create zip, add memory stream----------
For n As Integer = 0 To wrkAr.Count - 1
wrkFS = wrkAr(n)
wrkZip.AddEntry(wrkFS.FileName, wrkFS.ContentStream)
Next
context.Response.Clear()
context.Response.ContentType = "application/force-download"
context.Response.AddHeader(_
"content-disposition", _
"attachment; filename=" & "_XYZ_Export.zip")
'---- save context (initiate download)-----
wrkZip.Save(context.Response.OutputStream)
wrkZip.Dispose()
End Using
Catch ex As Exception
Dim exmsg As String = ex.Message
Dim wrkStop As String = ""
End Try
End Sub
以下是在主站点上可以正常工作的非zip下载功能。 也许可以将Zip内容转换为字节数组,然后尝试下载这种方式,但是,我不确定这将如何工作。 (见上面的编辑注释---我实现了下面的一个版本,即尝试下载字节数组而不是直接ZipFile.Save(),但是,它没有帮助;仍然不下载,并且仍然不放弃任何错误消息)
Public Sub DownloadEncryptedMemoryStream(ByVal context As HttpContext) _
Implements IHttpHandler.ProcessRequest
Dim wrkMemoryStream As New System.IO.MemoryStream()
wrkMemoryStream = SC.ContentForDownload
Dim wrkFileName As String = SC.ExportEncryptedFileName
wrkMemoryStream.Position = 0
Dim wrkBytesInStream As Byte() = New Byte(wrkMemoryStream.Length - 1) {}
wrkMemoryStream.Read(wrkBytesInStream, 0, CInt(wrkMemoryStream.Length))
Dim wrkStr As String = ""
wrkStr = Encoding.UTF8.GetString(wrkMemoryStream.ToArray())
wrkMemoryStream.Close()
context.Response.Clear()
context.Response.ContentType = "application/force-download"
context.Response.AddHeader("content-disposition", "attachment; filename=" & wrkFileName)
context.Response.BinaryWrite(wrkBytesInStream)
wrkBytesInStream = Nothing
context.Response.End()