Asp MVC, теряется ли сеанс при создании решения?

Asked
Viewd1967

3

Я пишу приложение в ASP.NET MVC.В основном у меня есть страницы, требующие аутентификации пользователя.После входа пользователя в систему я сохраняю строку пользователя в сеансе.Таким образом, в моем контроллере я могу получить доступ к user.ID без дополнительных запросов.

Когда проект находится в режиме отладки, я могу изменять только элементы в представлениях.Не в контроллере.

Если я не занимаюсь отладкой, я могу создать решение и просмотреть внесенные мной изменения, не запуская проект (с помощью F5). НО , он теряет все переменные сеанса, которые у меня есть.

Таким образом, в основном для каждого, независимо от того, насколько незначительны изменения в контроллере, я должен выйти из системы, войти в систему, чтобы увидеть свои изменения.

Это нормальное поведение?

3 ответов

2

Как заявил Дэн, это нормальное поведение.Чтобы упростить (и немного повысить надежность), нужно немного изменить код.Это, конечно, предполагает, что вы храните не только идентификатор пользователя в сеансе, поскольку вы можете получить доступ к идентификатору пользователя через Controller.User.Identity.Name, когда они аутентифицированы.Таким образом, вы выполняете поиск дополнительных данных в объекте сеанса, и если он не возвращает значение null, используйте его.Если он действительно возвращает значение null, снова найдите дополнительную информацию на основе идентификатора пользователя и снова сохраните ее в сеансе.Это подход, который я использую для хранения информации из Active Directory, и он отлично работает.

  • Вот почему вы сначала проверяете сеанс.Вы запрашиваете БД только в том случае, если сеанс равен нулю.

    Agent_919111 ноября 2009, 17:28
  • Да, я сделаю это.Но разве запросы к базе данных на каждой странице для получения сведений о пользователях не требуют больших затрат?

    gong11 ноября 2009, 08:18
2

Да, это нормальное поведение ASP.NET в целом, а не только MVC.

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

Доброта,

Дэн

  • @gong, посмотрите мой ответ ниже по поводу обработки информации.

    Agent_919110 ноября 2009, 14:52
  • Так как же отлаживать большие проекты?Вы всегда выходите из системы, входите в систему для просмотра изменений? Можем ли мы хранить данные о пользователях где-нибудь еще?Например, Request.IsAuthenticated истинно помимо того факта, что сеанс потерян.Могу ли я сохранить там учетные данные?

    gong10 ноября 2009, 14:08
1

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

  1. Если вам нужен только доступ к идентификатору пользователя, используйте User.Indentity.Name

  2. Если для отображения нужны только основные данные пользователя, такие как имя пользователя, то вы можете сохранить их в файле cookie сеанса. Предупреждение : делайте это только для отображения данных, если вы не зашифруете данные файлов cookie, данные файлов cookie в виде простого текста не заслуживают доверия.

  3. Если ваши пользовательские данные более сложные, чем эти, то обращайтесь к ним с помощью метода, который использует кеширование, как это предлагает Agent_9191

Добавьте что-то подобное в базовый контроллер или метод расширения

 protected UserData GetUserData() {
  UserData user = HttpContext.Session["User"] as UserData;
  if (user == null) {
    user = UserDataRepository.GetUser(User.Identity.Name);
    HttpContext.Session.Add("User", user);
  }
  return user;
}