Asp.net &引用;发送http标头后,服务器无法追加标头";

Asp.net &引用;发送http标头后,服务器无法追加标头";,asp.net,asp.net-3.5,Asp.net,Asp.net 3.5,我有一个类似于电子邮件系统的应用程序。在这里,我调整了一个解决方案,从特定帖子下载表中的所有文件。 这是我的代码: protected void lbu_download_all_Click(object sender, EventArgs e) { if (rpt_file_list.Items.Count > 0) { using (DataClassesDataContext db = new DataClass

我有一个类似于电子邮件系统的应用程序。在这里,我调整了一个解决方案,从特定帖子下载表中的所有文件。 这是我的代码:

    protected void lbu_download_all_Click(object sender, EventArgs e)
    {
        if (rpt_file_list.Items.Count > 0)
        {
            using (DataClassesDataContext db = new DataClassesDataContext())
            {
                var query = from f in db.Files
                            where f.Post_History_id == int.Parse(post_id.Value.ToString())
                            select new
                            {
                                FileName = f.File_name,
                                File_ext= f.File_ext
                            };
                foreach (var item in query)
                {
                    System.IO.FileInfo objFile = new FileInfo(Server.MapPath("~/PostFiles/" + item.FileName.ToString() + item.File_ext.ToString()));
                    if (objFile.Exists)
                    {
                        Response.Clear();
                        string strFileName = item.FileName.ToString() + item.File_ext.ToString();
                        Response.AddHeader("Content-Disposition", "attachment; filename=" + strFileName);
                        Response.AddHeader("Content-Length", objFile.Length.ToString());
                        Response.ContentType = "application/octet-stream";
                        Response.WriteFile(objFile.FullName);
                        Response.BufferOutput = true; 
                        Response.Flush();
                    }
                }
            }
        }
        else
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("<script type = 'text/javascript'>");
            sb.Append(" No files found to download');");
            sb.Append("</script>");
            ClientScript.RegisterStartupScript(this.GetType(), "script", sb.ToString());
        }
    }
受保护的无效lbu\u下载\u全部\u单击(对象发送方,事件参数e)
{
如果(rpt_文件_list.Items.Count>0)
{
使用(DataClassesDataContext db=newdataclassesdatacontext())
{
var query=来自db.Files中的f
其中f.Post_History_id==int.Parse(Post_id.Value.ToString())
选择新的
{
FileName=f.File\u name,
File\u ext=f.File\u ext
};
foreach(查询中的var项)
{
System.IO.FileInfo objFile=新文件信息(Server.MapPath(“~/PostFiles/”+item.FileName.ToString()+item.File_ext.ToString());
if(objFile.Exists)
{
Response.Clear();
字符串strFileName=item.FileName.ToString()+item.File_ext.ToString();
Response.AddHeader(“内容处置”、“附件;文件名=“+strFileName”);
AddHeader(“Content-Length”,objFile.Length.ToString());
Response.ContentType=“应用程序/八位字节流”;
WriteFile(objFile.FullName);
Response.BufferOutput=true;
Response.Flush();
}
}
}
}
其他的
{
StringBuilder sb=新的StringBuilder();
某人加上(“”);
sb.Append(“未找到可下载的文件”);
某人加上(“”);
RegisterStartupScript(this.GetType(),“script”,sb.ToString());
}
}

我不知道是什么问题,请帮助我。

您是否有
响应。BufferOutput=true设置是否正确?如果没有,页面将在生成时发送,这意味着Response.Clear()不会执行您想要的操作:)

您将无法下载多个这样的文件,我想发生的情况是循环经过一次,然后在第二次迭代时抛出异常

你真正应该做的是把所有的文件压缩成一个文件下载,这会让你明白我的意思

通过压缩文件,您还将获得压缩的好处(更少的带宽,更快的传输),并且用户(在当前场景中)不会看到多个“另存为”对话框窗口(更专业!)


这也可能有助于您了解其他一些可能的想法(例如使用带有URL参数的“下载”页面来识别文件)。不过,我更喜欢压缩单文件选项

是的,正如你所说,我已经设置好了,但问题还没有解决。