Response.Redirect正在执行POST而不是GET

时间:2013-03-10 04:37:40

标签: c# asp.net post get response.redirect

我的页面上有一个LinkBut​​ton,当它被点击时,正常的行为将回发到同一页面(你可以通过刷新页面命中F5告诉页面被POST,你将从浏览器获得一个确认框“您要查找的页面使用了您输入的信息。返回页面可能会导致您重复执行任何操作。是否要继续?“)

因此,为了防止用户重新提交已处理的表单,我决定将其重定向到同一页面。

void LinkButton1_Click(object sender, EventArgs e) {
    Response.Redirect("Default.aspx"); //redirecting back to the same page
}

就我而言,Response.Redirect应该使用GET,但在这种情况下它使用POST(在重定向之后,如果我想重新提交表单,F5刷新仍会提示我)。我怀疑Response.Redirect没有被执行所以我将URL从“Default.aspx”更改为“HelloWorld.aspx”,它位于同一服务器相同的目录中,并且正确地重定向。现在点击F5会立即刷新页面,而不会询问我是否要重新提交页面。

是什么给出的?我的页面上有其他代码,但我怀疑它们是否导致了这种行为,而且它们太长了,无法在此处发布。如果需要,我会提供它。感谢您抽出宝贵时间阅读本文。

2 个答案:

答案 0 :(得分:2)

发生了什么

我在Chrome中注意到了这个问题,但没有注意到Firefox或IE。

事实上,Chrome正在执行GET,但它将POST和GET绑在一起 - 我想有一些优化。

您可以通过点击 Ctrl-F12 查看网络标签来确认此行为。请注意,将有302 POST和200 GET。

我不清楚Chrome正在做什么,因为调试器显示302后跟GET,但刷新明确提示表单重新提交。

信息冲突

有关互联网上302重定向的严重错误信息,特别是在Stack Overflow上。

历史上,大多数浏览器在遇到302重定向时都将POST转换为GET。

但是,根据标准,POST应该保持POST,并且GET应保持GET(Source)。尽管如此,大多数浏览器仍继续将所有302转换为GET。

他们可能会这样做,因为典型的浏览体验对于所有额外的表单重新提交对话框来说更加烦人。它的浏览速度可能更快。

如何解决

303重定向是POST后重定向应用程序的正确方法。

Response.Clear();
Response.Status = "303 See Other";
Response.AddHeader("Location", "MyNewURL");
Response.End();

如果您使用此方法,所有浏览器的行为都会一致,因为浏览器必须使用GET作为新网址。

<强>参考

答案 1 :(得分:2)

您使用的是Chrome吗? Post/Redirect/Get模式似乎已被破坏,即使发布了Response.Redirect(),也会导致“确认表单重新提交”对话框:https://code.google.com/p/chromium/issues/detail?id=21245

其次,Response.Redirect()总是这样工作,使用Default.aspx作为例子:

  • 打开页面
  • 客户端:HTTP GET Default.aspx
  • 服务器:HTTP 200 Ok
  • 输入表单数据,按提交按钮
  • 客户端:HTTP POST Default.aspx
  • 服务器:HTTP 302重定向到Default.aspx
  • 客户端:HTTP GET Default.aspx

我创建了一个带有表单的示例ASP.NET应用程序,然后添加了一个带有调用Response.Redirect(Request.RawUrl)的事件处理程序的LinkBut​​ton,顺便提一下,它优先于Response.Redirect("Default.aspx"),因为它使用了相对路径用于调用页面,适用于开发和部署环境。

在IE中,将数据输入表单并按提交,然后按F5,我没有收到“确认表单重新提交”对话框。与Firefox相同;没有对话。但在Chrome中,我确实收到了警告。我唯一的结论是你可能会遇到Chrome问题。