服务器无法在发送 HTTP 标头之后清除标头

abz7676 2016-10-17 05:57:49
功能为出现进度条之后再下载文档



jsBlock = "<script>EndTrans('已经完成100%');</script>";
System.Web.HttpContext.Current.Response.Write(jsBlock);
System.Web.HttpContext.Current.Response.Flush();
System.Threading.Thread.Sleep(20);

// 处理完成
jsBlock = "<script>EndTrans('导出完成,请等待下载');</script>";
System.Web.HttpContext.Current.Response.Write(jsBlock);
System.Web.HttpContext.Current.Response.Flush();

// 用时
endTime = DateTime.Now;
System.Web.HttpContext.Current.Response.Write(jsBlock);
System.Web.HttpContext.Current.Response.Flush();


Response.Clear();

Response.ClearHeaders();

Response.Buffer = false;

Response.ContentType = "application/octet-stream";

Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(DownloadFile.Name, System.Text.Encoding.UTF8));

Response.AppendHeader("Content-Length", DownloadFile.Length.ToString());

Response.WriteFile(DownloadFile.FullName);

Response.Flush();

Response.End();





问题出在导出文档代码中的Response.ClearHeaders()这一句,报错信息为"服务器无法在发送 HTTP 标头之后清除标头"

求解决这个问题的方法
...全文
960 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
abz7676 2016-10-28
  • 打赏
  • 举报
回复
引用 18 楼 WM_JAWIN 的回复:
你是想实现一个进度条,然后下载内容是吧 我可以很负责的告诉你,按你现在,一次流程下来,是不可能完成的。 在客户端,至少要发送两次请求。才可以实现你的目的 第一步,访问你的进度条的url(这一步也不好做,因为服务器,浏览器等,都会可能对你的小数据包进行缓存) 第二步,进度达到100%时,再访问下载url
原来是这样,多谢指导。
WM_JAWIN 2016-10-27
  • 打赏
  • 举报
回复
你是想实现一个进度条,然后下载内容是吧 我可以很负责的告诉你,按你现在,一次流程下来,是不可能完成的。 在客户端,至少要发送两次请求。才可以实现你的目的 第一步,访问你的进度条的url(这一步也不好做,因为服务器,浏览器等,都会可能对你的小数据包进行缓存) 第二步,进度达到100%时,再访问下载url
正怒月神 2016-10-19
  • 打赏
  • 举报
回复
为何要加上这句话Response.ClearHeaders()
abz7676 2016-10-19
  • 打赏
  • 举报
回复
引用 16 楼 sundacheng1989 的回复:
[quote=引用 13 楼 abz7676 的回复:] [quote=引用 12 楼 sundacheng1989 的回复:] Flush要放在clear后边
试过了,还是报错,唉。[/quote] 为今之计,可以一点点的去注释掉多余的代码,然后一遍遍的跑,看是因为哪个代码出错的。[/quote] 好的,我试一下。
孙大诚_SunRobin 2016-10-19
  • 打赏
  • 举报
回复
引用 13 楼 abz7676 的回复:
[quote=引用 12 楼 sundacheng1989 的回复:] Flush要放在clear后边
试过了,还是报错,唉。[/quote] 为今之计,可以一点点的去注释掉多余的代码,然后一遍遍的跑,看是因为哪个代码出错的。
abz7676 2016-10-18
  • 打赏
  • 举报
回复
引用 10 楼 closurer 的回复:
[quote=引用 9 楼 closurer 的回复:] [quote=引用 3 楼 abz7676 的回复:] [quote=引用 1 楼 closurer 的回复:] 有什么问题呢?
断点追踪到Response.ClearHeaders()这一句出的错:服务器无法在发送 HTTP 标头之后清除标头[/quote] 要看你在 Response.ClearHeaders() 之前是否有调用 Response.End() 或 Response.Flush() 如果调用了,那么你这个功能需要分开两个页面做。 如果没有调用,你需要在 Response.ClearHeaders() 【之前】 设置 Response.BufferOutput = true[/quote] 更正一下,和 Response.BufferOutput = true 的位置无关。 你应该是在 Response.ClearHeaders() 之前显式或隐式做了 Flush 操作。[/quote] 对的,在之前做过Flush 操作
闭包客 2016-10-18
  • 打赏
  • 举报
回复
引用 9 楼 closurer 的回复:
[quote=引用 3 楼 abz7676 的回复:] [quote=引用 1 楼 closurer 的回复:] 有什么问题呢?
断点追踪到Response.ClearHeaders()这一句出的错:服务器无法在发送 HTTP 标头之后清除标头[/quote] 要看你在 Response.ClearHeaders() 之前是否有调用 Response.End() 或 Response.Flush() 如果调用了,那么你这个功能需要分开两个页面做。 如果没有调用,你需要在 Response.ClearHeaders() 【之前】 设置 Response.BufferOutput = true[/quote] 更正一下,和 Response.BufferOutput = true 的位置无关。 你应该是在 Response.ClearHeaders() 之前显式或隐式做了 Flush 操作。
闭包客 2016-10-18
  • 打赏
  • 举报
回复
引用 3 楼 abz7676 的回复:
[quote=引用 1 楼 closurer 的回复:] 有什么问题呢?
断点追踪到Response.ClearHeaders()这一句出的错:服务器无法在发送 HTTP 标头之后清除标头[/quote] 要看你在 Response.ClearHeaders() 之前是否有调用 Response.End() 或 Response.Flush() 如果调用了,那么你这个功能需要分开两个页面做。 如果没有调用,你需要在 Response.ClearHeaders() 【之前】 设置 Response.BufferOutput = true
abz7676 2016-10-18
  • 打赏
  • 举报
回复
引用 6 楼 WM_JAWIN 的回复:
Flush之后,数据已经发送给客户端。难不成跟客户端说,你不要显示,刚才发错内容了? 你想实现的功能,要拆成两步来做,也就是说,客户端要发起至少两个请求。
求问这段代码应该怎么写?
abz7676 2016-10-18
  • 打赏
  • 举报
回复
引用 5 楼 kongwei521 的回复:
把Response.ClearHeaders(); 删除 添加Response.BufferOutput = true;//设置输出缓冲 或者不删除直接添加 Response.BufferOutput = true;//设置输出缓冲 试试看
两种方法都试了,还是报错:服务器无法在发送 HTTP 标头之后清除标头
WM_JAWIN 2016-10-18
  • 打赏
  • 举报
回复
Flush之后,数据已经发送给客户端。难不成跟客户端说,你不要显示,刚才发错内容了? 你想实现的功能,要拆成两步来做,也就是说,客户端要发起至少两个请求。
蝶恋花雨 2016-10-18
  • 打赏
  • 举报
回复
把Response.ClearHeaders(); 删除 添加Response.BufferOutput = true;//设置输出缓冲 或者不删除直接添加 Response.BufferOutput = true;//设置输出缓冲 试试看
abz7676 2016-10-18
  • 打赏
  • 举报
回复
引用 2 楼 qq_20324803 的回复:
你想要干嘛?就是删是吧?不删不舒服?
断点追踪到Response.ClearHeaders()这一句出的错:服务器无法在发送 HTTP 标头之后清除标头,如何才能不报错?
abz7676 2016-10-18
  • 打赏
  • 举报
回复
引用 1 楼 closurer 的回复:
有什么问题呢?
断点追踪到Response.ClearHeaders()这一句出的错:服务器无法在发送 HTTP 标头之后清除标头
  • 打赏
  • 举报
回复
引用 4 楼 abz7676 的回复:
[quote=引用 2 楼 qq_20324803 的回复:] 你想要干嘛?就是删是吧?不删不舒服?
断点追踪到Response.ClearHeaders()这一句出的错:服务器无法在发送 HTTP 标头之后清除标头,如何才能不报错?[/quote] 多余的代码可以先删除。
abz7676 2016-10-18
  • 打赏
  • 举报
回复
引用 12 楼 sundacheng1989 的回复:
Flush要放在clear后边
试过了,还是报错,唉。
孙大诚_SunRobin 2016-10-18
  • 打赏
  • 举报
回复
Flush要放在clear后边
摇撼大地 2016-10-17
  • 打赏
  • 举报
回复
你想要干嘛?就是删是吧?不删不舒服?
闭包客 2016-10-17
  • 打赏
  • 举报
回复
有什么问题呢?

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧