【问题标题】:ASP.NET strange server error on file download文件下载时 ASP.NET 奇怪的服务器错误
【发布时间】:2010-08-11 11:44:46
【问题描述】:

我在尝试下载动态生成的 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.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) 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 编写器,ICollection 子级)× System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter 编写器,ICollection 子级)× System.Web.UI.Page.Render(HtmlTextWriter 编写器)× System.Web.UI。 Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean 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();
}

【问题讨论】:

  • 输出在哪里声明和初始化?
  • 压缩文件的大小是多少?由于服务器上没有足够的内存供 w3wp 进程加载附件,我曾经看到过类似的情况
  • 我已经更新了代码。文件大小约为10M。但它适用于某些客户......在一些不适用..

标签: asp.net


【解决方案1】:

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

response.End() 抛出异常,然后可能其余页面随机进入!因为你(和我)不知道异常在哪里跳转。所以关闭文件命令被绕过了!。

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

另外我建议使用 using(){} 来打开关闭文件,如果 zip 文件存在内存问题,可能会使用 缓冲读取文件太大了。

同样使用此代码,您还有打开的文件,所以下一个循环的输出可能为空,因为无法打开文件...

【讨论】:

  • @Automator 那么可能是 zip 的大小,你需要改变你阅读它的方式 - 并用缓冲区部分地阅读它。在女巫行中,您得到空异常?
  • 奇怪的是,有些电脑上下载的相同文件正常,有些电脑上没有,压缩总是一样的。
  • @Automator 那么可能是被防火墙/防病毒软件切断了?并关闭连接...你能在缓冲过程中检查这个 Response.IsClientConnected 吗?
【解决方案2】:

最后,找到答案。这是非常简单/愚蠢的。 上面的代码检查了用户是否已登录。如果没有,则没有要渲染的内容。 对于登录管理界面的人来说,一切都很好,但其他人得到了渲染异常。 谢谢大家!

【讨论】:

    猜你喜欢
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 2021-10-12
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 2011-06-22
    相关资源
    最近更新 更多