DotNetZip下载工作在一个站点,而不是另一个

时间:2015-06-18 20:54:23

标签: asp.net vb.net visual-studio dotnetzip

编辑 - 解决:区别在于" 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()

1 个答案:

答案 0 :(得分:0)

(根据问题顶部的说明):不同之处在于,在“主”情况下,下载是通过回调周期启动的,而在“测试”情况下,它是通过服务器端按钮启动的点击功能。我的猜测是下载请求和回调周期相互干扰,都会停止下载并导致页面变为非活动状态(如下所述)。当我重新启动主页上的下载以开始提交而不是回调时,它确实启动了下载。