【问题标题】:ASP.NET MVC : strange POST behaviorASP.NET MVC:奇怪的 POST 行为
【发布时间】:2011-01-09 08:59:32
【问题描述】:

ASP.NET MVC 2 应用程序

我的控制器 (Toons) 上有两个操作:

  1. [GET] 列表
  2. [POST] 添加

应用程序在 IIS7 集成模式下运行,因此 /Toons/List 工作正常。但是当我做 POST(内部重定向到 /Toons/List)时,它会重定向(移动了 302 个对象)回到 /Toons/Add。

如果我使用 .aspx hack(在 IIS6/IIS7 经典模式下工作),问题就会消失。

但没有 .aspx - GET 工作正常,但 POST 将我重定向到自身但使用 GET。

我错过了什么?

我正在使用 webhost4life.com 托管,他们确实已经将 IIS7 更改为集成模式。

编辑:代码使用 UltiDev Cassini 服务器按预期工作。

编辑: 结果是 URL 中的尾部斜杠问题。如果末尾没有斜线,则 IIS7 不知何故无法正确路由请求。

EDET:行为说明
当我请求(POST)/Toons/List(不带斜杠)时会发生什么,IIS 找不到处理程序(我不知道 IIS 究竟如何进行 URL 到处理程序的映射)并重定向请求(使用302 代码)到/Toons/List/(注意尾部斜杠)。

根据 HTTP 规范,浏览器必须使用相同的方法(在这种情况下为 POST)重定向请求,但它会将 302 当作 303 处理并发出 GET 请求新的 URL。

这是不正确的,但大多数浏览器的已知行为。

解决方案是使用 .aspx-hack 让 IIS 明确如何将请求映射到 ASP.NET 处理程序,或者配置 IIS 以使用 ASP.NET 处理程序处理虚拟目录中的所有内容。

问:有什么更好的方法来处理这个问题?

【问题讨论】:

  • 添加操作的代码是什么?
  • return RedirectToAction("List", "Toons");
  • 如果您采取 [GET] 的 List 操作会发生什么?
  • 列表操作的 [GET] 工作正常,因为 IIS 响应重定向到 /Toons/List/ - 这是使用 [GET] 请求重新请求的。
  • RFC 2068 注意:当收到 302 状态码后自动重定向 POST 请求时,一些现有的 HTTP/1.0 用户代理会错误地将其更改为 GET 请求。

标签: asp.net-mvc redirect asp.net-mvc-2 asp.net-mvc-routing


【解决方案1】:

您可以控制自己的代码。 将所有发布后不带斜杠的页面更改为发布到正确的页面。 如果它的第 3 方客户端返回异常,他们应该修复错误。

这是预期的行为,恢复可能发生的一切不是您的工作。 但你应该给出好的提示(例如异常消息,而不是奇怪的错误或重定向。)

【讨论】:

  • 是的,我可以这样解决。我使用 ASP.NET MVC 的路由,我试图避免侵入 MVC 的路由以在 URL 中添加斜杠。使用 UltiDev 不像 IIS 7 那样做(即使用 UltiDev,我的代码可以按我的意愿完美运行)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
  • 2015-03-06
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多