2010-05-20 74 views
2

当我试图通过Response.Redirect(URL)重定向到另一个页面正在以下错误: - System.Web.HttpException: Cannot redirect after HTTP headers have been sent.不能重定向后HTTP标头已被送往

我写了一个Response.Write("Sometext");在调用重定向方法之前调用Response.Flush()

在这种情况下我们该如何使用Response.Redirect(URL)

我正在通过异步调用执行存储过程。 SP将需要将近3分钟才能执行。那时我会从服务器获取负载平衡器超时错误,因为此应用程序正在云计算机中运行。为了避免负载平衡器超时,我正在向浏览器写入一些文本(response.write()Flush())。

+0

的[可能的复制为什么我收到“无法重定向后HTTP标头已经发送“当我调用Response.Redirect()?](http://stackoverflow.com/questions/159523/why-do-i-get-cannot-redirect-after-http-headers-have-been-sent-when-我呼叫res) – 2017-03-22 06:32:33

回答

3

您需要确保在尝试发送HTTP标头之前,不要写入/清除任何东西。 发送标题后有没有合适的方式做一个重定向,因为唯一可以做的事情是输出JavaScript来做重定向(坏)或发送'meta刷新/位置'标签,这很可能不会是在正确的位置(HEAD内),从而导致无效的HTML。

+0

我通过异步呼叫执行存储过程。 SP将需要将近3分钟才能执行。那时我会从服务器获取负载平衡器超时错误,因为此应用程序正在云计算机中运行。 – Anilkumar 2010-05-20 05:39:36

0

你不能使用Response.Redirect,因为你已经走过标题并写出“Sometext”。在开始将数据写入客户端或进行META重定向之前,您必须检查(重定向条件)。

如果您想要显示文本并在5秒后重定向的页面之一,您可以选择META。

0

如果您在页面呈现开始之前(例如,您从页面的LoadPreRender事件重定向)重定向,则不会出现此错误。


我现在在您的评论中看到,您希望在长时间运行的存储过程完成后重定向。在这种情况下,您可能需要使用不同的方法。

你可以在你的页面上放一个例如AJAX UpdatePanelTimer,Timer可以每隔几秒检查存储过程是否完成,然后进行重定向。

这种方法还有一个优点,即在程序运行时,您可以在页面上放置一些“进行中”消息,以便您的用户知道事情仍在发生。

2

我有相同的错误和相同的方法。您可能想尝试使用JavaScript而不是直接调用Response.Redirect。

Response.Write("<script type='text/javascript'>"); 
Response.Write("window.location = '" + url + "'</script>"); 
Response.Flush(); 

工作很好,但我仍然需要检查它在不同的浏览器。

0

尽量做到以下几点:

catch (System.Threading.ThreadAbortException) 
     { 
      // To Handle HTTP Exception "Cannot redirect after HTTP headers have been sent". 
     } 
    catch (Exception e) 
     {//Here you can put your context.response.redirect("page.aspx");} 
0

对我来说,这个问题的原因是,在滚动GridView控件加载数据花费很长的时间。并没有完全加载gridview数据之前,但我按下重定向按钮。我得到这个错误。

可以减少您的数据得到

之前加载完成防止按下重定向按钮

1
if (!Response.IsRequestBeingRedirected) 
        Response.Redirect("~/RMSPlusErrorPage.aspx?ErrorID=" + 100, false); 
相关问题