【问题标题】:Improperly stored instance state in Action Filter动作过滤器中存储的实例状态不正确
【发布时间】:2012-01-04 18:10:34
【问题描述】:

我刚刚将我的项目从 ASP.NET MVC1.0 升级到 ASP.NET MVC4.0

真正让我害怕的是升级到MVC3.0文档的下面这句话

在以前的 ASP.NET MVC 版本中,动作过滤器是根据 除少数情况外要求。这种行为从来都不是保证 行为,但仅仅是一个实现细节和合同 过滤器是认为它们是无状态的。在 ASP.NET MVC 3 中,过滤器是 更积极地缓存。因此,任何自定义操作过滤器 不正确地存储实例状态可能会被破坏。

我认为没有简单的方法来测试由不正确存储的实例状态引起的错误。 如果我有问题,我很有信心我只会在生产中找到它。

不正确存储的实例状态在这里真正意味着什么?

我有这个代码:

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
   ProductModel productModel = new ProductModel()
   filterContext.ActionParameters["model"] = productModel;
}

这是不正确存储实例状态的示例吗?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 action-filter


    【解决方案1】:

    不,您的代码 sn-p 没问题。不正确存储的状态将是一些类级别的属性,例如:

    public class StatefulActionFilter : ActionFilter
    {
      private readonly IPrincipal currentPrincipal = Thread.CurrentPrincipal;
    
      public override void OnActionExecuting(ActionExecutingContext filterContext)
      {
        ...
        // Using currentPrincipal here would be bad, since it may refer to the principal of a previous request.
        ...
      }
    }
    

    【讨论】:

    • 以及如何避免它们?我想为过滤器保留一些简单的选项,每个实例都有一个带有默认值的全局注册,并且一些控制器有自己的属性和其他值。当前使用实例级属性的方法会丢失全局值。
    • 嗨@Akbari,我不确定我是否理解您的评论-您能详细说明一下吗?或者,如果它是另一个相关但相切的查询,请在 SO 上提出另一个问题并在此处链接到它?谢谢!
    • 嗨 Rich,我实际上在这里问了这个问题 [stackoverflow.com/q/47666835/3967440]。感谢您的关注。
    猜你喜欢
    • 2020-02-22
    • 2021-10-12
    • 2013-06-07
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    • 2018-03-16
    • 2022-01-06
    相关资源
    最近更新 更多