文件下载时ASP.NET奇怪的服务器错误

时间:2010-08-11 11:44:47

标签: asp.net

尝试下载zip文件时,我遇到了非常奇怪的错误。 在一些客户端计算机上一切正常,文件下载完美,在其他客户端计算机上存在服务器异常(我正在尝试使用不同的浏览器进行测试):

消息: 你调用的对象是空的 堆栈跟踪: ASP.development_detail_aspx .__ RenderContent1(HtmlTextWriter __w,Control parameterContainer)вSystem.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer,ICollection children)вSystem.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer,ICollection children)вSystem。 Web.UI.HtmlControls.HtmlForm.RenderChildren(HtmlTextWriter writer),System.Web.UI.HtmlControls.HtmlForm.Render(HtmlTextWriter输出),System.Web.UI.HtmlControls.HtmlForm.RenderControl(HtmlTextWriter writer),System.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();
}

2 个答案:

答案 0 :(得分:0)

我在这里假设并且我不是100%肯定。

response.End()抛出异常,之后可能其余的页面随机出现!因为你(和我)不知道异常跳转的位置。因此绕过了关闭文件命令!。

我建议删除结束(),并使用 Flush()

另外我建议使用使用(){}打开文件,如果zip文件可能因内存问题而导致文件的缓冲读取太大了。

此代码还有你打开的文件,所以也许下一个周期的输出为null,因为无法打开文件......

答案 1 :(得分:0)

最后,找到答案。这非常简单/愚蠢。 在代码上方检查用户是否已登录。如果没有,则无法呈现。 对于登录管理界面的人来说,正常,但其他人得到了渲染异常。 谢谢大家!