我们最近从mvc2升级到了mvc3,我们的一个自定义授权过滤器(它位于ActionResult方法上)似乎只构建了一次,但执行了多次。我们知道这一点,因为过滤器包含一个错误列表(在构造函数中更新),错误被添加到AuthorizeCore上。
自定义过滤器用于检查用户对特定操作方法的访问权限(他们的级别存储在会话中)
一些代码:
public class SecurityAttribute : AuthorizeAttribute
{
public int MinAccessLevel = 1;
public string UserRole = String.Empty;
private List<string> _errors;
public SecurityAttribute()
{
_errors = new List<string>();
}
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (WebSession.AccessLevel < MinAccessLevel)
_errors.Add("Your access level(" + WebSession.AccessLevel + ") must be " + MinAccessLevel + " or higher");
if (!String.IsNullOrEmpty(UserRole) && WebSession.UserRole != UserRole)
_errors.Add("Your User Role must be " + UserRole);
if (_errors.Any())
{
var viewResult = new ViewResult() { ViewName = "SecurityError"};
viewResult.ViewData.Model = new SecurityErrorViewModel(){Errors = _errors};
filterContext.Result = viewResult;
}
}
}
如下所示:
[HttpPost, Security(MinAccessLevel = 4)]
public ActionResult Complete(int id, string userid){}
视图上的输出(随机间隔)如下(在项目符号列表中)
<代码>F 211
这个问题只发生在我们升级到mvc3之后,所以我想找出为什么会发生这种情况,或者进行适当的修复。我读过关于Sessionless State控制器等的各种SO帖子,但这似乎不适合我们所面临的情况
谢谢,马克
发布于 2011-06-24 03:59:09
根据MVC 3发行说明:
在以前的ASP.NET MVC版本中,动作过滤器是在每个请求的基础上创建的,少数情况除外。这种行为从来就不是一个有保证的行为,而仅仅是一个实现细节,过滤器的契约就是将它们视为无状态的。在ASP.NET MVC 3中,过滤器被更积极地缓存。因此,任何不正确地存储实例状态的自定义操作筛选器都可能被破坏。
因此,不应将错误存储在操作筛选器中。无论是直接在OnAuthorization
方法中添加列表,还是如果需要访问其他地方的列表,都可以将它们存储在HttpContext.Items或Session中。
https://stackoverflow.com/questions/6465376
复制相似问题