locked
ASP.NET MVC работа с сессиями RRS feed

  • Вопрос

  • Всем доброго времени суток. У меня есть вопрос на который я не могу ответить.
    Смысл моего вопроса в хранении данных сессии в определенном объекте.
    Так вот. Я знаю что сессия хранится в памяти на сервере и для каждого юзера начавшего сессию создается уникальный идентификатор сессии.
    Я задумал создать класс который будет хранить данные сесси, и еще список из таких классов.
    Как я думаю, тут напрашивается синглтон, сам собой, который будет гарантировать что у одного пользователя будет только 1 объект класса сессии.
    И эти объекты класса сессий, вместе со списком сессий должны быть доступны всем контроллерам приложения.
    А теперь вопрос. Где мне создавать объект класса сессии? При авторизации пользователя?
    Если да, то тогда где мне создавать объект списка сессий? При старте приложения?
    Если да, то как мне сделать атк что бы вне зависимости от того, как работает приложение, объекты списка и сессии уничтожались только тогда когда я этого хочу, а не сборщиком мусора когда я его(объект) перестал использовать? 
    Покидайте в меня ссылками где подробно все это рассказывается, пожалуйста.
    Усилинно читаю msdn но вопросов только больше.
    • Перемещено ulcerModerator 2 ноября 2012 г. 10:35 (От:Языки программирования)
    2 ноября 2012 г. 7:31

Ответы

  • "Смысл моего вопроса в хранении данных сессии в определенном объекте." - так это за Вас уже сделано. Коллекция HttpContext.Session. Просто она пустая, использовать её или нет решаете Вы. Так что изобретать велосипед ненадо.

    "Я знаю что сессия хранится в памяти на сервере и для каждого юзера начавшего сессию создается уникальный идентификатор сессии." - по умолчанию да, но можно и в БД хранить.

    "А теперь вопрос. Где мне создавать объект класса сессии? При авторизации пользователя?" - сессия пуста, объект создаётся при первом обращении к нему, авторизация и прочее не имеют значение. Т.е. объект создаётся тогда, когда возникает в нём необходимость, когда Вы туда что-то записываете.

    "Если да, то тогда где мне создавать объект списка сессий? При старте приложения?" - уже ответил высше.

    "Если да, то как мне сделать атк что бы вне зависимости от того, как работает приложение, объекты списка и сессии уничтожались только тогда когда я этого хочу, а не сборщиком мусора когда я его(объект) перестал использовать?" - это общая философия .Net, идти против течения ненужно.

    Вот пример как можно с сессией работать. Если нет острой необходимости, старайтесь не использовать сессию вообще.

    • Предложено в качестве ответа YatajgaModerator 6 ноября 2012 г. 5:38
    • Отменено предложение в качестве ответа akavoid 12 ноября 2012 г. 3:25
    • Помечено в качестве ответа akavoid 12 ноября 2012 г. 3:25
    2 ноября 2012 г. 8:21
    Модератор
  • "В общем я создаю функциональность для приложения - сохранение данных в бд в зависимости от userid. User сам не может указывать кто добавляет данные, это должно определять приложение автоматически," - зачем тогда данные сессии, берите данные аутентификации.

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

    • Изменено YatajgaModerator 2 ноября 2012 г. 11:26
    • Предложено в качестве ответа YatajgaModerator 6 ноября 2012 г. 5:38
    • Помечено в качестве ответа akavoid 12 ноября 2012 г. 3:25
    2 ноября 2012 г. 11:21
    Модератор

Все ответы

  • "Смысл моего вопроса в хранении данных сессии в определенном объекте." - так это за Вас уже сделано. Коллекция HttpContext.Session. Просто она пустая, использовать её или нет решаете Вы. Так что изобретать велосипед ненадо.

    "Я знаю что сессия хранится в памяти на сервере и для каждого юзера начавшего сессию создается уникальный идентификатор сессии." - по умолчанию да, но можно и в БД хранить.

    "А теперь вопрос. Где мне создавать объект класса сессии? При авторизации пользователя?" - сессия пуста, объект создаётся при первом обращении к нему, авторизация и прочее не имеют значение. Т.е. объект создаётся тогда, когда возникает в нём необходимость, когда Вы туда что-то записываете.

    "Если да, то тогда где мне создавать объект списка сессий? При старте приложения?" - уже ответил высше.

    "Если да, то как мне сделать атк что бы вне зависимости от того, как работает приложение, объекты списка и сессии уничтожались только тогда когда я этого хочу, а не сборщиком мусора когда я его(объект) перестал использовать?" - это общая философия .Net, идти против течения ненужно.

    Вот пример как можно с сессией работать. Если нет острой необходимости, старайтесь не использовать сессию вообще.

    • Предложено в качестве ответа YatajgaModerator 6 ноября 2012 г. 5:38
    • Отменено предложение в качестве ответа akavoid 12 ноября 2012 г. 3:25
    • Помечено в качестве ответа akavoid 12 ноября 2012 г. 3:25
    2 ноября 2012 г. 8:21
    Модератор
  • В общем я создаю функциональность для приложения - сохранение данных в бд в зависимости от userid.

    User сам не может указывать кто добавляет данные, это должно определять приложение автоматически, для этого решил использовать сессию.

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

    2 ноября 2012 г. 10:51
  • "В общем я создаю функциональность для приложения - сохранение данных в бд в зависимости от userid. User сам не может указывать кто добавляет данные, это должно определять приложение автоматически," - зачем тогда данные сессии, берите данные аутентификации.

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

    • Изменено YatajgaModerator 2 ноября 2012 г. 11:26
    • Предложено в качестве ответа YatajgaModerator 6 ноября 2012 г. 5:38
    • Помечено в качестве ответа akavoid 12 ноября 2012 г. 3:25
    2 ноября 2012 г. 11:21
    Модератор
  • Об аутентификации я нашел немного информации(пока что использую стандартную аутентификацию)  в частности "User.Identity.Name", который содержит логин пользователя прошедшего аутентификацию. Я хочу сохранять о юзере чуть больше информации, его id, его имя и фамилию(не логин).

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


    • Изменено akavoid 2 ноября 2012 г. 11:33
    2 ноября 2012 г. 11:32
  • Идентификатор сессии меняется после его истечения, т.е. не имеет значение, что это один и тот же пользователь, он каждый раз новый. Если Вы используете стандартный Membership API, как я понял это так, то все данные которые вы хотите можете брать из таблицы aspnet_Users используя класс Membership, а те что не доступны, например UserId, напрямую из БД посредством ADO.NET.

    2 ноября 2012 г. 11:44
    Модератор
  • Форумы сегодня сильно глючат, то ссылки битые, то половина ответа не доходит.
    2 ноября 2012 г. 11:46
    Модератор
  • Спасибо.

    Пара вопросов на уточнение:

     ADO.NET вы используете голый? Имеется в виду без EF? Если да, то как вы это делаете, принцип, что используете?

    6 ноября 2012 г. 6:06
  • "ADO.NET вы используете голый?" - где важна высокая скорость и гибкость, то да. В остальных случаях EF. В серьёзных проектах в основном их комбинацию. На самом деле EF тоже использует его, только абстрагирует Вас от написания рутинного кода. "Если да, то как вы это делаете, принцип, что используете?" - SqlCommand. Более подробно тут.
    6 ноября 2012 г. 6:22
    Модератор
  • А какую гибкость предоставляет ADO?
    8 ноября 2012 г. 8:08
  • Полный контроль над запросами.
    8 ноября 2012 г. 8:12
    Модератор
  • Последний вопрос, подскажите пожалуйста книгу о том, как работать с ado.net.

    Я хочу глубоко понять его. Привык читать книги.

    Спасибо.

    12 ноября 2012 г. 11:40
  • Самая лучшая: Дэвид Сеппа - "Microsoft ADO.NET". Книга старая, но материал в ней актуальный.
    12 ноября 2012 г. 11:48
    Модератор
  • Спасибо.

    Было бы великолепно если бы мне еще пару вещей пояснили. (Хотя быть может я о них в книге прочту)

    На примере ОРМ и EF, я понял, что - технология которая инкапсулирует запросы и сама их создает имеет большое преимущество перед рукотворными запросами в бд, так вот я уверен что использовать ado нужно примерно так же. Нельзя же писать в переменную типа string запрос а потом его использовать в sql data adaptere? Или я не прав?

    13 ноября 2012 г. 5:59
  • "ADO.NET вы используете голый?" - где важна высокая скорость и гибкость, то да. В остальных случаях EF. В серьёзных проектах в основном их комбинацию. На самом деле EF тоже использует его, только абстрагирует Вас от написания рутинного кода. "Если да, то как вы это делаете, принцип, что используете?" - SqlCommand. Более подробно тут.

    Я же Вам ответил высше. И новые вопросы лучше задавать в новой ветке, чтобы не растягивать ветку и уходить от темы.
    13 ноября 2012 г. 6:17
    Модератор