Сессия ASP.NET

Первым аргументом для полей внешнего ключа должна быть сама модель, а не строка модели (например, не «Team», а Team - аналогично для EmailTemplate)

 class TestSuite(models.Model):
     # Change this field's first argument from a string to the Team class
     team_name = models.ForeignKey(Team, on_delete=models.DO_NOTHING, db_column='team_name')
     suite_name = models.CharField(max_length=100)
     description = models.CharField(max_length=200, blank=True, null=True)
     schedule = models.CharField(max_length=100, blank=True, null=True)
     email_list_ok = models.CharField(max_length=200, blank=True, null=True)
     email_list_fail = models.CharField(max_length=200, blank=True, null=True)
     # Change this field's first argument from a string to the EmailTemplates class
     template_name = models.ForeignKey(EmailTemplates, on_delete=models.DO_NOTHING, db_column='template_name')

     class Meta:
         managed = False
         db_table = 'test_suite'
         unique_together = (('team_name', 'suite_name'),)
24
задан Seb Nilsson 25 September 2008 в 13:44
поделиться

13 ответов

Нет ничего по сути злого с состоянием сеанса.

существует несколько вещей иметь в виду, что это могло бы укусить Вас хотя:

  1. , Если пользователь нажимает кнопку "Назад" браузера, Вы возвращаетесь к предыдущей странице, но Ваше состояние сеанса не вернулось. Таким образом, Ваш CurrentAccount не мог бы быть тем, что это первоначально было на странице.
  2. процессы ASP.NET могут быть переработаны IIS. Когда это произойдет Вы затем, запрос запустит новый процесс. Если Вы будете использовать в состоянии сеанса процесса, значении по умолчанию, оно закончится:-(
  3. , Сессия может также тайм-аут с тем же результатом, если пользователь не активен в течение некоторого времени. Это принимает значение по умолчанию к 20 минутам, таким образом, хороший ланч сделает это.
  4. Используя из состояния сеанса процесса требует, чтобы все объекты, хранившие в состоянии сеанса, были сериализуемыми.
  5. , Если пользователь открывает второе окно браузера, он будет ожидать иметь второе и отличное приложение, но состояние сеанса, скорее всего, будет общим между к два. Так изменение CurrentAccount в одном окне браузера выполнит в том же другой.
38
ответ дан 28 November 2019 в 22:13
поделиться

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

Использование переменных Session является классическим решением этой проблемы, но оно имеет ряд недостатков. Среди них (1) большие объемы данных могут занимать ОЗУ сервера, если вы используете управление сеансами inproc, (2) совместное использование переменных сеанса между несколькими серверами в ферме серверов требует дополнительных соображений, и (3) профессионально разработанное приложение должно Защита от истечения сеанса (не просто приведите переменную сеанса, а используйте ее - если сеанс истек, приведение вызовет ошибку). Однако для подавляющего большинства приложений переменные сеанса, несомненно, являются подходящим способом.

Альтернативой является передача информации о каждой форме в URL. Основная проблема с этим подходом состоит в том, что вам нужно быть чрезвычайно осторожным в «передаче» информации. Например, если вы собираете информацию на четырех страницах, вам необходимо собрать информацию на первой странице, передать ее в URL-адресе на вторую страницу, где вы должны сохранить ее в состоянии просмотра этой страницы. Затем при вызове третьей страницы вы будете собирать данные формы со второй страницы, а также переменные состояния представления и кодировать их как в URL-адресе и т. Д. Если у вас есть пять или более страниц или если посетитель будет переходить по сайту, вы в ваших руках будет настоящий беспорядок. Имейте также в виду, что вся информация должна быть A) сериализована в строку, безопасную для URL, и B) закодирована таким образом, чтобы предотвратить простые взломы на основе URL (например, если вы указали цену открытым текстом и передали ее вместе кто-то может изменить цену). Обратите внимание, что вы можете уменьшить некоторые из этих проблем, создав своего рода «диспетчер сеансов» и заставив его управлять строками URL для вас, но вам все равно придется быть чрезвычайно чувствительным к возможности того, что любая данная ссылка может уничтожить весь сеанс, если это не удалось должным образом.

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

Итак, давайте предположим, что вы действительно управляете данными пользователя, используя встроенную возможность сеансов. Почему кто-то сказал бы вам, что "Сессия зла"? Что ж, в дополнение к приведенным выше соображениям о загрузке памяти, ферме серверов и истечении срока действия, основной критике переменных Session является то, что они фактически являются нетипизированными переменными.

К счастью, предусмотрительное использование переменных Session может избежать проблем с памятью (большие элементы должны храниться в базе данных в любом случае), и если вы используете сайт, достаточно большой, чтобы требовать фермы серверов, существует множество механизмов, доступных для создания состояния общего доступа. в ASP.NET (подсказка: вы не будете использовать inproc storage).

Чтобы избежать практически всех остальных недостатков Session, я рекомендую реализовать объект для хранения данных сеанса, а также некоторые простые возможности управления объектами Session. Затем встроите их в потомок класса Page и используйте этот класс Page для всех своих страниц. Тогда вам будет просто получить доступ к вашим данным Session через класс страницы в виде набора строго типизированных значений. Обратите внимание, что поля вашего объекта дадут вам доступ к каждой из ваших «переменных сеанса» строго типизированным способом (например, одно поле на переменную).

Дайте мне знать, если это простая задача для вас или вам нужен пример кода!

19
ответ дан 28 November 2019 в 22:13
поделиться

Насколько я знаю, Session намеченный способ хранить эту информацию. Следует иметь в виду, что состояние сеанса обычно хранится в процессе по умолчанию. Если у Вас есть несколько веб-серверов, или если существует перезагрузка IIS, Вы теряете состояние сеанса. Это может быть зафиксировано при помощи Государственной службы ASP.NET, или даже базы данных SQL для хранения сессий. Это гарантирует, чтобы люди вернули свою сессию, даже если они перенаправлены к различному веб-серверу, или в случае перерабатывания рабочего процесса.

10
ответ дан 28 November 2019 в 22:13
поделиться

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

6
ответ дан 28 November 2019 в 22:13
поделиться

Что касается "Сессии, являющейся злым"..., если бы Вы разрабатывали в классическом ASP, я должен был бы согласиться, но ASP.NET/IIS делает намного лучшее задание.

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

Другой мало лакомые кусочки из информации, которой не нужна никакая долгосрочная персистентность, мы используем комбинацию cookie и состояния отображения.

6
ответ дан 28 November 2019 в 22:13
поделиться

Если вы хотите хранить информацию, к которой можно получить глобальный доступ, в вашем веб-приложении, то для этого можно использовать атрибут ThreadStatic. Это превращает элемент static из Class в элемент, который используется текущим потоком, но не другими потоками. Преимущество ThreadStatic заключается в том, что вам не нужно иметь доступный веб-контекст. Например, если у вас есть серверная часть, которая не ссылается на System.Web, но также хочет поделиться информацией там, вы можете установить id пользователя в начале каждого запроса в свойстве ThreadStatic и ссылаться на него. в вашей зависимости без необходимости иметь доступ к объекту Session.

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

5
ответ дан 28 November 2019 в 22:13
поделиться

Я думаю с помощью объекта Сессии, в порядке в этом случае, но необходимо помнить, что Сессия может истечь, если нет никакого действия браузера в течение долгого времени ( HttpSessionState. Свойство Timeout определяет в том, сколько мелкий поставщик состояния сеанса завершает сессию), таким образом, лучше проверить на существование значения перед возвратом:

public static Account GetCurrentAccount(HttpSessionState session)
{
    if (Session[ACCOUNT]!=null)
        return (Account)Session[ACCOUNT];
    else
        throw new Exception("Can't get current account. Session expired.");
}
3
ответ дан 28 November 2019 в 22:13
поделиться

http://www.tigraine.at/2008/07/17/session-handling-in-aspnet/

надеюсь, что это поможет.

2
ответ дан 28 November 2019 в 22:13
поделиться

Краткосрочная информация, это только должно жить до следующего запроса, может также быть сохранен в ViewState. Это означает, что объекты сериализируются и хранятся на странице, отправленной в браузер, который тогда отправляется назад на сервер на событии щелчка или подобный. Тогда эти ViewState декодируется и превращается объекты снова, готовый быть полученным.

1
ответ дан 28 November 2019 в 22:13
поделиться

Сессии не являются злыми, они выполняют важную функцию в приложении ASP.NET, служа данным, которые должны быть совместно использованы несколькими страницами во время "сессии" пользователя. Существуют некоторые предложения, я сказал бы, чтобы использовать управление сеансами SQL, когда когда-либо возможно и удостовериться, что объекты, которые Вы используете в своем наборе сессии, являются "сериализуемыми". Лучшие практики должны были бы использовать объект сессии, когда Вы абсолютно должны поделиться информацией состояния через страницы и не используете ее, когда Вы не должны. Информация не будет доступной стороной клиента, сеансовый ключ сохранен или в cookie, или через строку запроса или использование других методов в зависимости от того, как это настроено, и затем объекты сессии доступны в таблице базы данных (если Вы не будете использовать InProc, в этом случае Ваши сессии будут иметь шанс того, чтобы быть сдувшимся во время перезагрузки сайта или будут представлены почти бесполезные в большинстве кластерных сред).

1
ответ дан 28 November 2019 в 22:13
поделиться

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

1
ответ дан 28 November 2019 в 22:13
поделиться

Все, что вы помещаете в объект сеанса, остается там на время сеанса, пока оно не будет очищено. Плохое управление памятью, хранящейся с использованием inproc и stateserver, заставит вас масштабироваться раньше, чем необходимо. Сохраняйте только идентификатор для сеанса / пользователя в сеансе и загружайте то, что необходимо, в объект кэша по требованию, используя вспомогательный класс. Таким образом, вы можете точно настроить его время жизни в соответствии с тем, как часто эти данные мы использовали. Следующая версия asp.net может иметь распределенный кеш (слух).

1
ответ дан 28 November 2019 в 22:13
поделиться

Сессия как зло: Не в ASP.NET, правильно настроенном. Да, это идеально, чтобы быть максимально не сохраняющим состояние, но действительность - то, что Вы не можете добраться там отсюда. Можно, однако, заставить Сессию вести себя способами, которые уменьшают ее влияние - Особенно сессии базы данных или StateServer.

1
ответ дан 28 November 2019 в 22:13
поделиться
Другие вопросы по тегам:

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