【发布时间】:2011-01-09 08:59:32
【问题描述】:
ASP.NET MVC 2 应用程序
我的控制器 (Toons) 上有两个操作:
- [GET] 列表
- [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