尝试下载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();
}
答案 0 :(得分:0)
我在这里假设并且我不是100%肯定。
response.End()抛出异常,之后可能其余的页面随机出现!因为你(和我)不知道异常跳转的位置。因此绕过了关闭文件命令!。
我建议删除结束(),并使用 Flush()
另外我建议使用使用(){}打开文件,如果zip文件可能因内存问题而导致文件的缓冲读取太大了。
此代码还有你打开的文件,所以也许下一个周期的输出为null,因为无法打开文件......
答案 1 :(得分:0)
最后,找到答案。这非常简单/愚蠢。 在代码上方检查用户是否已登录。如果没有,则无法呈现。 对于登录管理界面的人来说,正常,但其他人得到了渲染异常。 谢谢大家!