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

本文关键字:GET POST 执行 Redirect Response | 更新日期: 2023-09-27 18:03:05

我的页面上有一个 LinkButton,当单击它时,正常行为将回发到同一页面(您可以通过刷新页面按 F5 来判断页面已发布,您将从浏览器获得一个确认框"您正在寻找的页面使用了您输入的信息。返回该页面可能会导致重复执行的任何操作。是否要继续?

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

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 从"默认.aspx"更改为"HelloWorld.aspx",它位于同一服务器同一目录中,并且它正确重定向。现在按 F5 将立即刷新页面,而不会询问我是否要重新提交页面。

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

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

你使用的是 Chrome 嗎?Post/Redirect/Get 模式似乎已损坏,即使发出 Response.Redirect(( 也会导致"确认表单重新提交"对话框:https://code.google.com/p/chromium/issues/detail?id=21245

其次,Response.Redirect(( 总是这样工作,以 Default.aspx 为例:

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

我创建了一个带有表单的示例 ASP.NET 应用程序,然后添加了一个带有调用Response.Redirect(Request.RawUrl)的事件处理程序的 LinkButton,顺便说一下,它比Response.Redirect("Default.aspx")之类的东西更受欢迎,因为它使用调用页面的相对路径并在开发和部署环境中工作。

在IE中,将数据输入表单并按"提交",

然后按F5后,我没有收到"确认表单重新提交"对话框。与火狐浏览器相同;没有对话框。但是在Chrome中,我确实收到了警告。我唯一的结论是您可能会遇到Chrome问题。

发生了什么

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

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

您可以通过按 Ctrl-F12 查看网络选项卡来确认此行为。 请注意,将有一个 302 POST 和一个 200 GET。

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

信息冲突

互联网上存在

关于 302 重定向的严重错误信息,尤其是在堆栈溢出上。

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

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

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

如何修复它

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

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

如果使用此方法,所有浏览器的行为都将一致,因为浏览器必须对新 URL 使用 GET。

引用

  • 302
  • 重定向
  • 303
  • 重定向