Почему ASP.NET MVC использует состояние сеанса? - PullRequest
33 голосов
/ 22 декабря 2008

Рекомендовано командой 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 с этого момента.

Ответы [ 4 ]

33 голосов
/ 22 декабря 2008

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

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

13 голосов
/ 22 декабря 2008

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

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

6 голосов
/ 22 декабря 2008

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

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

3 голосов
/ 17 апреля 2010

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

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

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

Вот альтернативная реализация, использующая распределенное кэширование MS Velocity. Velocity TempData Provider

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...