Вопрос по asp.net-mvc-3 – Почему Session является катастрофой в приложении ASP.NET MVC?

35

Почему говоритсяWe should not use Session variables in ASP.NET MVC applications ? Я наткнулсяэтот ответ что говорит так. В таком случае, как я буду поддерживать значения между запросами, такими как информация о зарегистрированном пользователе и некоторые соответствующие данные, связанные с его учетной записью?

ЭтоДаринответ.

Why are you using HttpContext.Current in an ASP.NET MVC application? Never use it. That's evil even in classic ASP.NET webforms applications but in ASP.NET MVC it's a disaster that takes all the fun out of this nice web framework.

Вот статья, которая объясняет одну причину, почему использование HttpContext.Current является плохой идеей - в основном это не потокобезопасный:odetocode.com/articles/112.aspx JTech
Я не сказал, что вы не должны использовать сессию (на самом деле я сказал это, и я говорю это прямо сейчас, но не в ответе, с которым вы связаны). Я сказал, что вы не должны использоватьHttpContext.Current чтобы получить доступ к текущему HTTP-контексту. Darin Dimitrov

Ваш Ответ

2   ответа
7

Вы можете использовать состояние сеанса для сохранения данных, функциональность TempData использует Session по умолчанию для сохранения данных.

Вы должны минимизировать использование сеанса настолько, насколько это возможно, причина в том, что для сеанса выполняется блокировка для всех запросов, чтобы предотвратить повреждение состояния сеанса, например, из-за этого сериализуются несколько запросов Ajax. Дополнительная информацияВот

Вы можете использовать альтернативы для сохранения данных между запросами, например, вы можете использоватьCookieValueProvider, который является частью MVC Futures для привязки данных cookie к модели. Вы также можете сохранить данные в реальном DOM в виде скрытых полей, но опять-таки их следует максимально уменьшить, поскольку размер данных будет отражаться в сетевом трафике, поступающем в браузер и из него.

Я хотел бы рассмотреть возможность использования другого хранилища данных для вашего веб-приложения, если ваш основной магазин работает медленно. Например SQLServer CE или встроенный RavenDB.

Они синхронизируются, а не сериализуются.
Для ясности, последовательные события - одно за другим, под сериализацией обычно понимается случай, когда кто-то берет данные в память и помещает их в формат, который можно сохранить на диск.
Синхронизация параллельных запросов приводит к сериализации (один за другим)
Сериализация не означает один за другим. Я думаю, что слово, которое вы ищете, является "последовательным" где несколько процессов происходят один за другим. Сериализация - это когда объект превращается в необработанные байты для чего-то вроде «отправки их через поток». или «соединение через сокет tcp / ip», или сохранение их на диске, и т. д. и т. д. Я думаю, что правильное слово в данном контексте - это секвенирование, где параллельный алгоритм или процесс превращается в серию последовательных процессов.
27

Одним из фундаментальных принципов таких фреймворков, как ASP.NET MVC, является то, что ониstatelessтак же, как в Интернете. ASP.NET Web Forms - это попытка имитировать парадигму состояния с сохранением состояния без состояния.Это ложь, другими словами.

Использование переменной Session в приложении ASP.NET MVC немного похоже на привязывание рога к голове лошади и называние его единорогом.

Я до сих пор не вижу причин не использовать состояние сеанса. Иногда мне нужно хранить данные в разных запросах, так как мне это сделать без сеанса? Конечно, я мог бы хранить их в базе данных. Но что я получу с этим?
Можете ли вы обратиться к этой части вопроса?how will i maintain the values across requests ? По-видимому, я тоже делаю это очень неправильно ...
Там сессия, концепция иSession класс ASP.NET. Последнего следует избегать, насколько это возможно, но первый - просто слой для состояния по HTTP. Хотя аутентификация ASP.NET не используетсяSession, это оченьdoes использовать сеансы.
@asawyer: Это значит, что если я захожу на mysite.com со своими учетными данными, мне придется каждый раз отправлять myusername в URL? действительно ? в этом случае я могу получить вашу информацию, отправив ваше имя пользователя. Ни за что ! Happy
@Happy: ASP.NET MVC поддерживает состояние входа между запросами. Увидетьasp.net/mvc/tutorials/older-versions/security/…

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