1

我有一个使用 [HttpGet] 的公共 ASP.NET MVC 操作,如下所示:

[HttpGet]
public ActionResult List(OrganizationFilterModel p_model) {
    ...
}

如果用户请求的页面没有有效的用户会话,我们会将他们重定向到登录页面。登录系统在他们登录后将他们重定向到最初请求的 URL。

在此页面上,在某些情况下,从登录系统重定向到原始 URL 会导致抛出异常:

在控制器“MyApp.Controllers.OrganizationController”上找不到公共操作方法“List”。但是,如果我只是重新请求该页面,那么它会成功显示并且对于所有后续请求。

条件及其他说明:

  1. 用户拥有有效的 FormsAuth 票证。[意思是,他们最近登录]
  2. 由于过期或 AppDomain 重置,用户的会话消失了。
  3. 删除[HttpGet]修复问题。[即使失败的请求是 GET ]

在这些情况下,[HttpGet]过滤器的存在会阻止 MVC 找到操作,但仅在第一个请求时。所有后续请求都可以正常工作。

Fiddler 显示以下模式:

  • GET to /Organization/List -->返回 302 到登录页面
  • 获取/帐户/登录
  • POST 到 /Account/Login [用户登录,然后被重定向]
  • GET for /Organization/List -->抛出错误
  • GET for /Organization/List -->如果我重复请求,它工作正常

摘要:过滤器阻止了[HttpGet]该操作的定位,但仅限于第一个请求并且尽管它一个 GET 请求。

这是怎么回事?

更新: 添加一些附加信息:

  1. 使用 MVC 4
  2. 我们使用 FormsAuth 但不使用该[Authorize]属性。如果请求经过身份验证,我们有自定义代码OnActionExecuting强制登录,但没有有效的会话。(我们实际上只是将 FormsAuth 用于一些静态便捷方法和配置设置
  3. 如果 FormsAuth 导致重定向到登录页面,则不会发生此问题。如果我们的自定义代码导致重定向,则会出现此问题。
  4. 完全删除 FormsAuth 也可以解决此问题。

由于删除 FormsAuth 解决了这个问题,而且我们已经想这样做一段时间了,我将停止故障排除。我真的很想知道这是否是 FormsAuth + MVC [或 FormsAuth + Routing] 中的缺陷,或者我是否做了一些愚蠢的事情。

4

0 回答 0