Как получить данные для представления MVC из Global.asax - PullRequest
0 голосов
/ 18 ноября 2011

У меня есть веб-приложение MVC2, в котором я только что реализовал некоторый код тайм-аута сеанса. В Global.asax я добавил обработчик Session_End, который проверяет, открыта ли запись для редактирования, и, если это так, отправляет вызов веб-службы во внешнюю систему для отката записи в хранилище, чтобы она не блокировалась в состояние «открыто для редактирования». Запись по-прежнему отображается в браузере пользователя, поскольку мы не можем отправить сообщение в браузер, чтобы закрыть запись.

Когда пользователь в следующий раз взаимодействует со страницей (теперь по тайм-ауту), например, чтобы обновить, отменить, сохранить или отправить его, веб-приложение видит, что пользователь не вошел в систему (сеанс истек, поэтому логин прошел вместе с ним), и перенаправляет на страницу входа.

На странице входа в систему я хочу отобразить сообщение, объясняющее, почему пользователь был перенаправлен, что-то вроде: «Время сеанса истекло; пожалуйста, войдите снова. Если у вас была открытая запись, она откатилась до прежнего состояния . "

Вопрос: из Global.asax, где я могу сохранить сообщение, чтобы контроллер входа в систему или представление могли найти его при перенаправлении? Я не могу получить ссылку на ViewData в Global.asax. Когда я ссылаюсь на это как:

 System.Web.Mvc.ViewPage<My...LoginViewModel>.ViewData["ErrorMessage"] = "Your session timed out..."

Я получаю сообщение об ошибке:

An object reference is required for the non-static field, method, or property 'System.Web.Mvc.ViewPage<My...LoginViewModel>.ViewData.get'

Возможно ли то, что я пытаюсь сделать, и я просто не знаю, как правильно ссылаться на ViewData, или ViewData недоступен для Global.asax? В таком случае, какой мой лучший вариант для установки сообщения из Global.asax для отображения в виде?

1 Ответ

3 голосов
/ 18 ноября 2011

@ Val - Во-первых, вы не должны делать аутентификацию таким образом.Вы должны использовать конвейер и FormsAuthentication или аналогичные.Это может создать дыры в безопасности, которые могут быть использованы злоумышленниками или вредоносными ботами.Во-вторых, нет гарантии, что Session_End сработает, поэтому записи могут быть заблокированы на неопределенный срок.Например, если рабочий процесс перезапущен, Session_End никогда не будет вызван, поэтому вы не можете полагаться на этот механизм для разблокировки ресурсов.

Я предлагаю вам пересмотреть свой дизайн, чтобы не блокировать записи для редактирования таким способом,и не полагайтесь на session_end для чего-то критически важного.

...