2010-08-11 140 views
1

尝试下载zip文件时发生了非常奇怪的错误,并且在运行中生成。 在某些客户端计算机上一切正常,文件downlading完美,对他人有服务器异常(我尝试使用不同的浏览器进行测试):文件下载时出现ASP.NET奇怪的服务器错误

消息: 对象未设置为一个对象 堆栈跟踪的一个实例参考: вASP.development_detail_aspx .__ RenderContent1(HtmlTextWriter的__w,控制parameterContainer)вSystem.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter的作家,ICollection的儿童)вSystem.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter的作家,ICollection的儿童)в系统.Web.UI.HtmlControls.HtmlForm.RenderChildren(HtmlTextWriter writer)在System.Web.UI.HtmlControls.HtmlForm.Render(HtmlTextWriter输出)中System.Web.UI.HtmlControls.HtmlForm.RenderControl(HtmlTextWriter writer)在系统中m.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer,ICollection children)System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer,ICollection children)System.Web.UI.Page.Render(HtmlTextWriter writer)在System中。 Web.UI.Page.ProcessRequestMain(布尔includeStagesBeforeAsyncPoint,布尔includeStagesAfterAsyncPoint)

我的代码在asp:ImageButton的OnClick事件。服务器是IIS 7.5:

...

using (MemoryStream output = new MemoryStream()) 
{ 
    using (ZipOutputStream s = new ZipOutputStream(output)) 
    { 
     s.SetLevel(5); // 0 - store only to 9 - means best compression 
     byte[] buffer = new byte[4096]; 


     foreach (var file in devFiles) 
     { 
      if (file.PhisicalName != "") 
      { 
       ZipEntry entry = new ZipEntry(file.RealName); 
       s.PutNextEntry(entry); 
       using (FileStream streamer = File.OpenRead(HttpContext.Current.Server.MapPath(file.PhisicalName))) 
       { 
        int sourceBytes; 
        do 
        { 
         sourceBytes = streamer.Read(buffer, 0, buffer.Length); 
         s.Write(buffer, 0, sourceBytes); 
        } 
        while (sourceBytes > 0); 
       } 
      } 
     } 

    s.Finish();  
    HttpResponse response = HttpContext.Current.Response; 
    response.Clear(); 
    response.ContentType = "application/octet-stream"; 
    response.AppendHeader("Content-Disposition", "attachment; filename=doc.zip"); 
    response.AppendHeader("Content-Length", output.Length.ToString()); 
    response.BinaryWrite(output.ToArray()); 
    response.End(); 
    output.Close(); 
    s.Close(); 
} 
+0

输出声明和初始化在哪里? – Lazarus 2010-08-11 11:48:58

+0

压缩文件的大小是多少?由于服务器上没有足够的内存以供w3wp进程加载附加文件 – InSane 2010-08-11 11:58:54

+0

我已经更新了代码,因此我曾经见过类似的情况。该文件的大小约为10M。但它适用于某些客户..在某些不.. – vadimv 2010-08-11 12:23:24

回答

0

Finaly,找到答案。这非常简单/愚蠢。 上面的代码中有一个检查用户是否登录。如果没有,则不需要渲染。 对于已经登录管理界面的用户来说,可以,但是其他人得到了渲染异常。 谢谢大家!

0

我在这里做一个假设,我不是100%肯定。

response.End()抛出一个异常,之后可能其余的页面随机发送!因为你(和我)不知道异常是在哪里跳。所以关闭文件命令被绕过!

我建议删除末(),并使用同花顺()

此外,我建议使用(){}该文件打开关闭使用,也许一个如果zip文件太大,则由于内存问题而缓冲读取文件

也与该代码已打开的文件留下,也许在下一个周期输出为null,因为无法打开文件...

+0

我试着改变结束(),并使用Flush()它不工作.. – vadimv 2010-08-11 12:25:37

+0

@Automator然后也许是拉链的大小,你需要改变你阅读的方式 - 并逐个阅读缓冲器。在女巫线你得到空例外? – Aristos 2010-08-11 12:47:02

+0

奇怪的是,某些计算机上的相同文件下载正常,而其他计算机上则相同,zip总是相同。 – vadimv 2010-08-11 13:01:56

相关问题