ASP.NET MVC: удостоверьтесь, что пользователю всегда устанавливали переменную сеанса

Рассмотрите заявление MVC ASP.NET, которое требует, чтобы переменная сеанса была установлена. Это используется всюду по приложению. Это будет установлено или чтением хешированного значения на cookie браузера, или после наличия пользовательского входа в систему.

В модели WebForms + Master Page я проверил бы Page_Load () основной страницы. Возможно, не окончательное событие, но это было легкое для нахождения.

Как Вы проверили бы и осуществили бы существование переменной сеанса в ASP.NET MVC? Полагайте, что этот вопрос не мог бы включить пользовательские данные для входа в систему, но некоторую другую часть данных (сначала время посещения, возможно).

Попытки решения

public void Application_BeginRequest(Object source, EventArgs e)
{
    HttpApplication application = (HttpApplication)source;
    HttpContext context = application.Context;

    context.Session["SomeDateTime"] =  DateTime.Now.ToString();

    // results in Object reference not set to an instance of an object.
    // context.Session is null
} 
7
задан p.campbell 2 April 2010 в 20:27
поделиться

3 ответа

У вас есть два варианта.

1. Поместите логику в функцию базового контроллера Initialize

Предполагая, что все ваши контроллеры унаследованы от базового контроллера, вы можете поместить необходимую логику в переопределение функции Execute () функция базового контроллера.

public class BaseController : Controller
{
    public BaseController()
    {

    }

    protected override void Initialize(System.Web.Routing.RequestContext requestContext)
    {
            // check if the user has the value here using the requestContext.HttpContext object
    }
{

2. Используйте функцию Global.asax void Application_PreRequestHandlerExecute (источник объекта, EventArgs e)

public void Application_PreRequestHandlerExecute(Object source, EventArgs e)
{
    HttpApplication application = (HttpApplication)source;
    HttpContext context = application.Context;

    // use an if statement to make sure the request is not for a static file (js/css/html etc.)
    if(context != null && context.Session != null)
    {
          // use context to work the session
    }
}

Примечание. Вторая часть работает с любым приложением ASP.NET, WebForms или MVC.

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

РЕДАКТИРОВАТЬ

Играя с этим, я заметил большую проблему с подходом Application_PreRequestHandlerExecute . Обработчик событий вызывается для любого запроса к серверу, будь то файлы .css / .js / .html. Я не уверен, что это проблема в том, как настроена моя рабочая станция, или просто в том, как работает ASP.NET/IIS, поэтому я бы удостоверился, что это не вызывается для всех запросов при реализации подхода, описанного выше.

По предыдущим причинам я заключил работу, которая должна быть выполнена в сеансе, с помощью оператора if .

10
ответ дан 6 December 2019 в 21:11
поделиться

Не уверен, что полностью понимаю вопрос, но я делаю это, переопределяя метод OnActionExecuting контроллера.

В нем вы делаете код, чтобы проверить, существует ли переменная сессии. Если нет, то создаете ее, если да, то используете.

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
  if (filterContext.HttpContext.Session != null)
  {
       //TODO: Get value from session etc.
  }
  base.OnActionExecuting(filterContext);
}
2
ответ дан 6 December 2019 в 21:11
поделиться

В качестве другой альтернативы класс ControllerActionInvoker вызывает каждый метод действия; он назначается контроллеру через фабрику контроллеров. Таким образом, вы можете создать подкласс этого вызывающего действия, каждый раз, когда вызывается действие (путем переопределения метода InvokeAction), проверяйте здесь наличие этого ...

0
ответ дан 6 December 2019 в 21:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: