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

时间:2015-11-05 14:10:30

标签: c# asp.net gridview

所以我在gridview中有一个按钮。如果用户单击该按钮,则发送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,但这并没有改变它。

修改

问题是我在“selectindexchanged”上设置了一个异步回发。 gridview的显示模式。有什么方法可以解决这个问题吗?当我更改触发器时,整个页面会在显示模态和重新生成之前重新加载。将文件更改为回发而不是asyncpostback

后,文件会下载

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

可能,Response.Buffer是假的。

您应该在编写标题后编写内容。

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

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

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