Asp MVC, сеанс теряется при создании решения? - PullRequest
3 голосов
/ 10 ноября 2009

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

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 10 ноября 2009

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

2 голосов
/ 10 ноября 2009

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

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

Доброжелательность,

Dan

1 голос
/ 10 ноября 2009

Перекомпиляция очистит все данные текущего сеанса. Однако он не удалит ваш билет проверки подлинности, который хранится в виде файла 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...