2015-11-05 77 views
2

所以我在我的gridview中有一个按钮。如果用户点击该按钮,则发送rowcommand并将pdf文件下载/写入响应。服务器无法在rowcommand发送HTTP标头之后设置内容类型

代码

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是在一个updatepanel中,但这不应该是一个问题,因为下载工作的其他按钮。

我也试过在我做文件下载之前发送缓冲区为真,但是没有改变它。

编辑

的问题是,仍然有一个异步回发,我不得不在GridView控件显示一个模式的“的SelectedIndexChanged”的设置。有什么办法可以解决这个问题吗?当我更改触发器时,在显示模态和resprings之前,整个页面会重新加载。文件下载后更改为回发,而不是asyncpostback

回答

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写文件

+0

对不起,这是在测试我的侧。我修改了我的awnser,发生了同样的错误。什么时候应该将缓冲区设置为true? –

+0

我不知道为什么Response.Buffer是错误的,因为默认情况下它是真的。来自UpdatePanel的请求可能会导致问题。你可以首先通过打破HttpResponse.Clear()来检查Response.Buffer的值吗? –

+0

检查[this](http://stackoverflow.com/questions/10014920/response-write-and-updatepanel) –

1

我有一个问题,这是非常相似的。我在一个试图打印PDF报告的ListView控件中有一个按钮。经过广泛的研究,我发现了一个非常简单的解

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

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