Подтвердить что ты не робот

Все еще хорошо использовать переменные сеанса в ASP.NET mvc, или есть лучшая альтернатива для некоторых вещей (например, тележка)

У меня есть ситуация, когда мне нужен доступ к корзине покупок на нескольких страницах. Итак, на странице продукта - создайте корзину, добавьте некоторые элементы На странице проверки корзины - подтвердите платежный адрес На стойке регистрации корзины - выполните окончательную проверку, добавьте корзину в БД и уходите на оплату.

Мой вопрос: какой лучший способ пройти по телеге?

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

TempData [] - это то, что я использовал для продукта на странице проверки, а затем подумал, что лучше всего продолжать устанавливать TempData все время, когда....

вы могли бы просто использовать переменную сеанса?

По какой-то причине я прочитал его не очень хорошую практику использования Session, поэтому вопрос.

Спасибо за ваше руководство, я могу с удовольствием предоставить код/​​дополнительную информацию, если вы сочтете это полезным.

4b9b3361

Ответ 1

Вполне нормально использовать сеансы в ASP.NET MVC, особенно в вашем сценарии корзины покупок.

Есть недостатки в использовании сеансов, но они, похоже, не относятся к вашему делу:

1) Сессии не позволяют пользователю правильно просматривать ваш сайт с нескольких вкладок браузера, изменения, сделанные на одной вкладке, отражаются во всех остальных. Но с корзиной покупок это именно то, что вам нужно. Вам не нужно несколько корзин для покупок для каждого пользователя, не так ли?

2) Сеансы не сохраняются по умолчанию, и если вы работаете в webfarm, вам необходимо сохранить сеансы в своей базе данных, чтобы они были доступны каждой ферме node. Но маловероятно, что вы так масштабируетесь. И если вы справитесь с необходимостью масштабирования, сеансы не будут вашими главными проблемами.

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

Есть также некоторые преимущества сеансов по скрытым входам:

1) Чем меньше накладных расходов. Только небольшой куки файл сеанса передается между вами и клиентом, а не полный набор скрытых входов.

2) Простое программирование. Вам не нужно обязательно включать скрытые входы на каждой странице.

3) Безопасность. Клиент может изменить содержимое скрытых входов, но он радует. Вы не можете легко передавать конфиденциальную информацию через скрытые входы, вам нужно ее зашифровать. Значения сеанса хранятся на сервере, поэтому клиент не имеет к ним доступа.

Ответ 2

Очень хорошо использовать сеанс с приложением asp.net mvc. Стив Сандерсон использовал сеанс для тележки в примере приложения, который поставляется с его книгой. Код доступен здесь

Ответ 3

Сеансы прекрасны, но рассмотрим систему стиля Amazon, в которой вы получаете куки файлы распознавания, даже если вы не вошли в систему. Это позволяет им хранить вашу корзину покупок в базе данных, привязанной к cookie-распознаванию.

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

Ответ 4

Я бы использовал сеанс, если бы не было причин его избежать.

Например, у меня есть один проект, в котором я повторяю вызовы на действие MVC в фоновом режиме. Это действие служит файлу, который медленнее по сети. Я использовал сессию, но я быстро обнаружил главный отрицательный эффект: IIS не будет выполнять вызовы от одного и того же пользователя параллельно, но только последовательно один за другим. Это сильно повлияло на производительность, поэтому я использовал альтернативный метод: я установил HttpContext.User.Identity для имени пользователя и использовал его в качестве ключа для извлечения из базы данных. Но вы, вероятно, можете установить его на какой-то случайный GUID и заменить это на Session.

Ответ 5

Я, как правило, использую cookie с корзиной, сериализованной в base64 string, кажется, это работает довольно хорошо.

Ответ 6

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

<system.web>
    <anonymousIdentification enabled="true" />
</system.web>

Затем по каждому запросу вы можете использовать свойство Request.AnonymousID (которое возвращает строку, представляющую GUID) для поиска корзины покупок в базе данных.

public ActionResult ShowCartDetails()
{
    var CartId = new Guid(Request.AnonymousID);

    // Lookup cart...

    return View();
}

Это не только более эффективно, чем использование состояния сеанса, но и проще.

Литература: