使用[HttpGet]时,在AppDomain重启后第一次请求时找不到ASP.NET MVC操作

时间:2013-03-19 21:27:04

标签: asp.net-mvc forms-authentication

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

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

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

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

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

条件和其他说明:

  1. 用户拥有有效的FormsAuth票证。 [意思是,他们最近登录了]
  2. 由于过期或AppDomain重置,用户的会话已消失。
  3. 删除[HttpGet]可解决问题。 [即使失败的请求是GET ]
  4. 在这些条件下,[HttpGet]过滤器的存在会阻止MVC查找操作,但仅限于第一个请求。所有后续请求都可以正常工作。

    Fiddler显示以下模式:

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

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

    发生了什么事?

    更新 要添加一些其他信息:

    1. 使用MVC 4
    2. 我们使用FormsAuth但不使用[Authorize]属性。我们在OnActionExecuting中有自定义代码,如果请求经过身份验证但没有有效会话,则会强制登录。 (我们实际上只是将FormsAuth用于一些静态便捷方法和配置设置
    3. 如果FormsAuth导致重定向到登录页面,则不会发生此问题。如果我们的自定义代码导致重定向,则会出现此问题。
    4. 删除FormsAuth也完全解决了这个问题。
    5. 由于删除FormsAuth可以解决问题,而且我们希望暂时解决这个问题,因此我不再需要进行故障排除。我真的很想知道这是否是FormsAuth + MVC [或FormsAuth + Routing]中的缺陷,或者我是否做了一些愚蠢的事情。

0 个答案:

没有答案