Почему ASP.NET MVC использует состояние сеанса?

Рекомендуется, чтобы команда ASP.NET использовала кеш вместо сеанса, мы прекратили использовать сеанс от работы с моделью WebForm последние несколько лет. Таким образом, мы обычно отключили сеанс в web.config

<sessionState mode="Off" />

Но теперь, когда я тестирую приложение ASP.NET MVC с этим параметром, он выдает ошибку в классе SessionStateTempDataProvider внутри рамки mvc, он попросил меня включить состояние сеанса, я сделал, и он сработал. Глядя на источник, он использует сеанс:

// line 20 in SessionStateTempDataProvider.cs
Dictionary<string, object> tempDataDictionary = 
httpContext.Session[TempDataSessionStateKey] as Dictionary<string, object>; 

Итак, зачем им использовать сессию здесь? Что мне не хватает?

=============================================== =========

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

Ответ 1

Сессия используется для хранилища TempData. TempData - это очень ограниченная форма состояния сеанса, которая будет длиться только до следующего запроса от определенного пользователя. (Изменить). В MVC 2+ оно продолжается до следующего считывания.) Цель TempData - хранить данные, затем выполнять перенаправление и сохранять сохраненные данные для действия, к которому вы просто перенаправлен.

Использование сеанса для хранилища TempData означает, что любая распределенная система кэширования, которая уже обрабатывает сеанс, будет работать для TempData. Предотвращение использования сеанса напрямую, когда TempData будет делать, имеет несколько преимуществ. Во-первых, вам не нужно самостоятельно очищать сеанс; TempData "истекает" самостоятельно.

Ответ 2

Рекомендуется использовать команду ASP.NET для использования кеш вместо сеанса

@ray247, можете ли вы предоставить ссылку для этого? Сессия и кэш различаются по своей природе и должны использоваться в зависимости от требований приложения. Например, хранение пользовательских данных в кеш может привести к нежелательному поведению. Конечно, если вы действительно хотите избежать использования сеанса, вы можете обеспечить собственную реализацию интерфейса ITempDataProvider.

Ответ 3

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

Сессии не являются злыми, если вы правильно их используете.

Ответ 4

Просто еще одна мысль. У TempData есть своя цель, и MS знает, что будет существовать разная школа мыслей относительно стойкого механизма TempData. Таким образом, по умолчанию они сделали постоянный магазин SessionState. Но дизайн по-прежнему очень гибкий. Основываясь на потребностях проекта и руководства, которое его ведет, вы можете создать своего собственного поставщика tempdata в соответствии с конкретными требованиями.

Вот несколько указателей на ресурсы TempData

Вот некоторые дополнительные улучшения в реализации TempData Улучшения TempData

Здесь альтернативная реализация с использованием распределенного кэширования MS Velocity. Поставщик TempData Velocity