我有一个使用 [HttpGet] 的公共 ASP.NET MVC 操作,如下所示:
[HttpGet]
public ActionResult List(OrganizationFilterModel p_model) {
...
}
如果用户请求的页面没有有效的用户会话,我们会将他们重定向到登录页面。登录系统在他们登录后将他们重定向到最初请求的 URL。
在此页面上,在某些情况下,从登录系统重定向到原始 URL 会导致抛出异常:
在控制器“MyApp.Controllers.OrganizationController”上找不到公共操作方法“List”。但是,如果我只是重新请求该页面,那么它会成功显示并且对于所有后续请求。
条件及其他说明:
- 用户拥有有效的 FormsAuth 票证。[意思是,他们最近登录]
- 由于过期或 AppDomain 重置,用户的会话消失了。
- 删除
[HttpGet]
修复问题。[即使失败的请求是 GET ]
在这些情况下,[HttpGet]
过滤器的存在会阻止 MVC 找到操作,但仅在第一个请求时。所有后续请求都可以正常工作。
Fiddler 显示以下模式:
- GET to /Organization/List -->返回 302 到登录页面
- 获取/帐户/登录
- POST 到 /Account/Login [用户登录,然后被重定向]
- GET for /Organization/List -->抛出错误
- GET for /Organization/List -->如果我重复请求,它工作正常
摘要:过滤器阻止了[HttpGet]
该操作的定位,但仅限于第一个请求并且尽管它是一个 GET 请求。
这是怎么回事?
更新: 添加一些附加信息:
- 使用 MVC 4
- 我们使用 FormsAuth 但不使用该
[Authorize]
属性。如果请求经过身份验证,我们有自定义代码OnActionExecuting
强制登录,但没有有效的会话。(我们实际上只是将 FormsAuth 用于一些静态便捷方法和配置设置) - 如果 FormsAuth 导致重定向到登录页面,则不会发生此问题。如果我们的自定义代码导致重定向,则会出现此问题。
- 完全删除 FormsAuth 也可以解决此问题。
由于删除 FormsAuth 解决了这个问题,而且我们已经想这样做一段时间了,我将停止故障排除。我真的很想知道这是否是 FormsAuth + MVC [或 FormsAuth + Routing] 中的缺陷,或者我是否做了一些愚蠢的事情。