Переменные сеанса в фильтре действий - программирование
Подтвердить что ты не робот

Переменные сеанса в фильтре действий

У меня есть фильтр действий, проверяющий, установлена ​​ли переменная сеанса ID. Для целей разработки я вручную установил эту переменную до проверки.

public class MyActionFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuted(ActionExecutedContext context)
        {

            context.HttpContext.Session.Add("ID", 123123);

            int ID = (int)context.HttpContext.Session.Contents["ID"];
            var rd = context.HttpContext.Request.RequestContext.RouteData;

            TED _db = new TED();

            //if not in DB
            if (_db.Users.Find(ID) == null && rd.GetRequiredString("action") != "NoAccess")
            {
                RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary();
                redirectTargetDictionary.Add("action", "NoAccess");
                redirectTargetDictionary.Add("controller", "Home");
                redirectTargetDictionary.Add("area", "");

                context.Result = new RedirectToRouteResult(redirectTargetDictionary);
            }

            base.OnActionExecuted(context);
        }
    }

Насколько я понимаю, этот код запускается до любой страницы, этот Session["ID"] всегда установлен. Сайт работает нормально, если я постоянно тестирую, но, похоже, он сломается, если я оставлю его на некоторое время, а затем попытаюсь продолжить тестирование. Вот ошибка, которую я получаю:

int UserID = (int)Session.Contents["ID"];
System.NullReferenceException: Object reference not set to an instance of an object.

Первоначально я думал, что сеанс может просто истекать, но до любой загрузки страницы Session["ID"] должен быть установлен. В чем проблема?

4b9b3361

Ответ 1

вы реализуете свой actionfilter по методу OnActionExecuted, который выполняется ПОСЛЕ вашего действия

Вы должны реализовать метод OnActionExecuting

public class MyActionFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext context)
        {

            context.HttpContext.Session.Add("ID", 123123);

            int ID = (int)context.HttpContext.Session.Contents["ID"];
            var rd = context.HttpContext.Request.RequestContext.RouteData;

            TED _db = new TED();

            //if not in DB
            if (_db.Users.Find(ID) == null && rd.GetRequiredString("action") != "NoAccess")
            {
                RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary();
                redirectTargetDictionary.Add("action", "NoAccess");
                redirectTargetDictionary.Add("controller", "Home");
                redirectTargetDictionary.Add("area", "");

                context.Result = new RedirectToRouteResult(redirectTargetDictionary);
            }

            base.OnActionExecuting(context);
        }
    }