【问题标题】:Server cannot set content type after HTTP headers have been sent on rowcommand在通过 rowcommand 发送 HTTP 标头后,服务器无法设置内容类型
【发布时间】:2015-11-05 14:10:30
【问题描述】:

所以我的网格视图中有一个按钮。如果用户单击该按钮,则会发送一个行命令并下载/写入一个 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,但这并没有改变它。

编辑

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

【问题讨论】:

    标签: c# asp.net gridview


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      很可能,Response.Buffer 是假的。

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

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

      【讨论】:

      • 抱歉,这是我这边的测试。我已经编辑了我的 awnser,更改它时发生了同样的错误。什么时候应该将缓冲区设置为 true?
      • 我不知道为什么 Response.Buffer 是假的,因为默认情况下它是真的。来自 UpdatePanel 的请求可能会导致问题。您可以先通过中断 HttpResponse.Clear() 来检查 Response.Buffer 的值吗?
      • 检查this
      • 我在调试时检查过它,直到最后它都是真实的。我会试试异步触发器
      • 这在当前设置中是不可能的,因为按钮 id 是在运行时生成的,所以控件 id 是未知的。
      猜你喜欢
      • 1970-01-01
      • 2012-06-24
      • 1970-01-01
      • 1970-01-01
      • 2014-01-27
      • 1970-01-01
      • 2011-01-23
      • 2015-11-07
      相关资源
      最近更新 更多