2015-06-18 66 views
0

编辑 - 解决:不同的是,在“主要”的情况下,下载是通过回调循环启动的,在“测试”的情况下,它是通过服务器端按钮启动的点击功能。我的猜测是下载请求和回调周期相互干扰,都会停止下载并导致页面变为非活动状态(如下所述)。当我在主页上重新下载了下载并开始提交而不是回叫时,它确实启动了下载。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() 

回答

0

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

相关问题