编辑 - 解决:区别在于" main"下载是通过回调周期启动的,并且在"测试"它是通过服务器端按钮单击功能启动的。我的猜测是下载请求和回调周期相互干扰,都会停止下载并导致页面变为非活动状态(如下所述)。当我重新启动主页上的下载以开始提交而不是回调时,它确实启动了下载。
这是VS2013 Ultimate,Win7Pro,VB.Net,网站(非项目),IISExpress。
我构建了一个测试站点来开发用于创建OpenXML PPTX和XLSX内存流以及使用DotNetZip压缩和下载它们的功能。搞定了。然后我将所有代码合并到我的" main"现场。两个站点都在同一台机器上;我可以同时运行测试站点和主站点。主站点处理稍微复杂一些,但仅限于访问和下载更多文件。
但是,Zip和Download功能(如下所示)在测试站点中工作正常,但完全相同的代码在主站点中不起作用(有或没有测试站点启动和运行)。
Zip.Save函数周围有一个错误陷阱(见下文),其中发生了下载,但没有出现错误。
Chrome,Firefox和IE11中的整体行为相同。
可能是一个线索的一个特点是,当主站点下载失败时,服务器端功能已经消失了#34;本地JS函数可以工作,但应用程序不响应回调。当我在浏览器上执行F5时,它会再次运行。
我在主站点的DotNetZip包上刷新了一下。 Zip对象似乎工作正常,因为它会在重复的文件名上生成错误。
我认为它可能是编写的下载功能,但是,它可以在测试站点中运行。另外,主站点的另一部分是非压缩下载的内存流(包含在下面的第二个代码块中),并且工作正常。
我认为这可能是数据。因此,我将主站点进行访问,转换为内存流并下载在测试站点中访问和下载的相同文件。主站点下载仍然无效。
当我比较两个站点中Zip对象的监视值时,它们看起来完全相同。在两种情况下,wrkFS.ContentStream的长度都相同。文件名不同,但它们是: Test_2EFVG1THK5.xlsx(主要) 6-18_12-46-28_0.xlsx(测试) 这两个都是合法的文件名。
编辑:我将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()
答案 0 :(得分:0)
(根据问题顶部的说明):不同之处在于,在“主”情况下,下载是通过回调周期启动的,而在“测试”情况下,它是通过服务器端按钮启动的点击功能。我的猜测是下载请求和回调周期相互干扰,都会停止下载并导致页面变为非活动状态(如下所述)。当我重新启动主页上的下载以开始提交而不是回调时,它确实启动了下载。