在rowcommand上发送HTTP标头后,服务器无法设置内容类型

本文关键字:服务器 设置 类型 rowcommand HTTP | 更新日期: 2023-09-27 18:20:45

所以我的网格视图中有一个按钮。如果用户单击按钮,将发送一个rowcommand,并下载/写入一个pdf文件到响应中。

代码

HttpResponse httpResponse = Response;
httpResponse.Clear();
httpResponse.ContentType = "application/pdf";
httpResponse.AddHeader("content-disposition", $"attachment;filename={rowData.Pod.fileName}");
httpResponse.Output.Write(bytes);
Response.Flush();
HttpContext.Current.ApplicationInstance.CompleteRequest();

出于某种原因,我在尝试下载文件时总是得到Server cannot set content type after HTTP headers have been sent.。现在gridview在更新面板中,但这应该不是问题,因为下载的其他按钮也可以。

在我下载文件之前,我也尝试过将缓冲区发送到true,但这并没有改变它

编辑

问题是,我在网格视图的"selectedindexchanged"上设置了一个异步回发,以显示模式。有什么办法可以解决这个问题吗?当我更改触发器时,整个页面在显示模态和呼吸之前会重新加载。将文件更改为回发而不是异步回发后下载

在rowcommand上发送HTTP标头后,服务器无法设置内容类型

我遇到了一个与此极其相似的问题。我在ListView控件中有一个按钮,它正试图打印pdf报告。经过广泛的研究,我找到了一个非常简单的解决方案。

OnInit="btnPrint_Init"添加到页面正面的按钮中,然后将以下内容添加到后面的代码中(更改按钮名称以满足您的需求):

    protected void btnPrint_Init(object sender, EventArgs e)
    {
        Button btnPrint = (Button)sender;
        ScriptManager.GetCurrent(this).RegisterPostBackControl(btnPrint);
    }

可能,Response.Buffer为false。

你应该在写标题之后再写内容。

httpResponse.ContentType = "application/pdf";
httpResponse.AddHeader("content-disposition", $"attachment;filename={rowData.Pod.fileName}");
httpResponse.Output.Write(bytes);

实际上,您可以为那些请求http处理程序的按钮设置JavaScript命令,这是下载文件的最佳实践。

出于安全原因,您可以创建一个guid,并将该guid放置到每行的会话项(以文件id为值),然后将该guid发送到http处理程序,并从会话和响应二进制文件中检索文件id。写入文件