ASP.Net MVC 3: где справиться с потерей сеанса? - PullRequest
5 голосов
/ 14 марта 2011

Я начал сталкиваться с ошибками, когда мой сеанс был потерян или после перестройки моего проекта, поскольку мой cookie для проверки подлинности с помощью форм все еще сохраняется.

В веб-формах я использовал бы мастер-страницу, связанную со страницами, которыеТребуется войти в систему, чтобы просто проверить сеанс.

Как бы я сделал это в одном месте в MVC?Я бы не хотел проверять состояние сеанса в каждом действии моих контроллеров.

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

Возможно ли это будет возможно в моем представлении макета?Это единственное, что объединяет страницы, требующие сессии.

Ответы [ 3 ]

2 голосов
/ 15 марта 2011

добавить его в начало сессии. если происходит потеря сеанса, он также должен инициировать начало сеанса. Вы можете справиться с этим следующим образом:

protected void Session_Start(object src, EventArgs e)
    {
        if (Context.Session != null)
        {
            if (Context.Session.IsNewSession)
            {
                string sCookieHeader = Request.Headers["Cookie"];
                if ((null != sCookieHeader) && (sCookieHeader.IndexOf("ASP.NET_SessionId") >= 0))
                {
                    // how to simulate it ???   
                    // RedirectToAction(“ActionName”, “ControllerName”,  route values);  
                    Response.Redirect("/Home/TestAction");
                }

            }
        }


    }
2 голосов
/ 14 марта 2011

Одна вещь, которую вы могли бы сделать, это выделить подклассы контроллеров, которым необходимо состояние сеанса.Таким образом, вы можете создать фильтр только на этом базовом контроллере.Это позволит вам сделать все это в одном месте.Кроме того, как вы указали, глобальный фильтр вам здесь не поможет, поскольку логика применима не ко всем контроллерам.

0 голосов
/ 10 ноября 2011

Я согласен с тем, что упомянул Стив, но я предлагаю использовать глобальные фильтры вместо создания базового класса для всех ваших контроллеров. Причиной этого является то, что каждый раз, когда вы создаете новый контроллер, вы всегда должны помнить о том, что он является производным от базового контроллера, или вы можете столкнуться со случайным поведением в вашем приложении, которое может занять несколько часов отладки. Это особенно важно, когда вы на время останавливаете разработку, а затем возвращаетесь к ней.

Кроме того, еще одна причина - это принцип "композиция благосклонности над наследством".

...