Это будет зависеть от версии ASP.NET MVC, но вы никогда не должны хранить состояние экземпляра в фильтре действий, который будет повторно использоваться между различными методами.Вот цитата, например, одного из критических изменений в ASP.NET MVC 3:
В предыдущих версиях ASP.NET MVC фильтры действий создавались по запросу, за исключениемнесколько случаев.Такое поведение никогда не было гарантированным поведением, а являлось лишь деталью реализации, и контракт на фильтры заключался в том, чтобы считать их не имеющими состояния.В ASP.NET MVC 3 фильтры кэшируются более агрессивно.Поэтому любые фильтры настраиваемых действий, которые неправильно хранят состояние экземпляра, могут быть повреждены.
Это в основном означает, что один и тот же экземпляр фильтра действий может быть повторно использован для различных действий, и если вы сохранили в нем состояние экземпляраон, вероятно, сломается.
И с точки зрения кода это означает, что вы никогда не должны писать фильтр действий, подобный этому:
public class TestAttribute : ActionFilterAttribute
{
private string _privateValue;
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
_privateValue = ... some calculation
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
// use _privateValue here
}
}
, но вы должны написать это так:
public class TestAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var privateValue = ... some calculation
filterContext.HttpContext.Items["__private_value__"] = privateValue;
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
var privateValue = filterContext.HttpContext.Items["__private_value__"];
// use privateValue safely here
}
}