Все еще можно использовать переменные Session в ASP.NET mvc, или есть лучшая альтернатива для некоторых вещей (например, корзина) - PullRequest
37 голосов
/ 19 июля 2011

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

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

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

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

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

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

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

Ответы [ 7 ]

56 голосов
/ 19 июля 2011

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

Существуют недостатки использования сессий, но, похоже, они не применимы к вашему делу:

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

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

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

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

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

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

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

11 голосов
/ 19 июля 2011

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

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

10 голосов
/ 19 июля 2011

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

5 голосов
/ 19 июля 2011

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

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

4 голосов
/ 14 апреля 2016

Для корзины покупок вы определенно не должны не использовать состояние сеанса . Разумный подход заключается в использовании модуля анонимной идентификации для управления файлом 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();
}

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

Ссылки:

2 голосов
/ 19 июля 2011

Я склонен использовать cookie с моей корзиной покупок, сериализованной в base64 string Это, кажется, работает очень хорошо

0 голосов
/ 27 мая 2018

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

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