2012-01-04 1 views
4

Я обновил свой проект с 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; 
} 

Это образец неправильно сохраненное состояние экземпляра?

ответ

5

Нет, ваш фрагмент кода в порядке. Неправильно сохраненное состояние будет представлять собой некоторые свойства уровня класса, например:

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. 
    ... 
    } 
} 
+0

И как их избежать? Я хочу сохранить некоторые простые параметры для фильтра, есть глобальная регистрация со значением по умолчанию для каждого экземпляра, а некоторые контроллеры имеют свои собственные атрибуты с другими значениями. Современный подход к использованию свойств уровня экземпляра теряет глобальные значения. – Akbari

+0

Привет @Акбари, я не уверен, что понимаю ваш комментарий - не могли бы вы уточнить? Или, если это другой связанный, но касательный запрос, пожалуйста, задайте еще один вопрос о SO и ссылку на него здесь? Благодаря! –

+0

Привет, Rich, я действительно задал вопрос здесь [https://stackoverflow.com/q/47666835/3967440]. Спасибо за внимание. – Akbari