Nadal ok, aby używać zmiennych sesji w ASP.NET mvc, czy jest lepsza alternatywa dla niektórych rzeczy (np. wózek)

Mam sytuację, w której potrzebuję dostępu do koszyka na kilka stron. Tak więc na stronie produktu - Utwórz koszyk i dodaj kilka przedmiotów Na stronie kasy koszyka - potwierdź adres rozliczeniowy Po dokonaniu zakupu w Koszyku - dokonaj ostatecznej kontroli, dodaj koszyk do DB i przejdź do payment

Moje pytanie brzmi, jaki jest najlepszy sposób, aby przejść wokół wózka?

Próbowałem przekazać koszyk ze strony do postback i utrzymanie wszystkich wartości przy życiu, jednak na niektórych stronach (adres rozliczeniowy strona potwierdzenia) to wydaje się dużo kłopotów, wszystko, co chcę sprawdzić, to adres rozliczeniowy i naprawdę nie chcę ton HiddenFor () na stronie, aby ponownie wypełnić koszyk

TempData [] jest tym, czego użyłem do strony produktu do kasy, a następnie zastanawiałem się, czy najlepiej jest cały czas ustawiać TempData....

Możesz użyć zmiennej sesji?

Z jakiegoś powodu czytałem, że nie jest to świetna praktyka korzystania z sesji, stąd pytanie.

Thanks for your wskazówki, mogę z przyjemnością podać kod/więcej informacji, jeśli uznasz to za pomocne.

Author: Keeno, 2011-07-19

7 answers

Jest to całkowicie OK, aby korzystać z sesji w ASP.NET MVC, zwłaszcza w Twoim scenariuszu koszyka na zakupy.

Są wady korzystania z sesji, ale wydają się nie stosować do twojego przypadku:

1) sesje uniemożliwiają Użytkownikowi prawidłowe przeglądanie witryny z wielu kart przeglądarki, zmiany wprowadzone w jednej karcie są odzwierciedlane we wszystkich innych. Ale z koszykiem na zakupy, to jest dokładnie to, czego potrzebujesz. Nie potrzebujesz kilku wózków na użytkownika, prawda?

2) sesje domyślnie nie są utrzymywane, a jeśli działasz na farmie internetowej, musisz zapisać sesje w bazie danych, aby były dostępne dla każdego węzła farmy. Ale wydaje się mało prawdopodobne, że tak się skalujesz. A jeśli spotkasz się z potrzebą skalowania, sesje nie będą twoimi największymi problemami.

3) sesje wymagają dodatkowych funkcjonalności z przeglądarki użytkownika (zazwyczaj pliki cookie). Ale wszystkie nowoczesne przeglądarki obsługują pliki cookie, więc musisz się martwić tylko o bardzo specjalne przeglądarki.

Tam są również pewne korzyści z sesji nad ukrytych wejść:

1) mniejszy nad głową. Tylko mały plik cookie sesji jest przekazywany tam iz powrotem między tobą a klientem, a nie kompletny zestaw ukrytych danych wejściowych.

2) prostsze programowanie. Nie musisz upewnić się, że zawarte ukryte dane wejściowe na każdej ze stron.

3) bezpieczeństwo. Klient może dowolnie zmieniać zawartość ukrytych wejść. Nie można łatwo przekazać poufnych informacji poprzez Ukryte wejścia, musisz je zaszyfrować. Wartości sesji są przechowywane na serwerze, więc klient nie ma do nich dostępu.

 54
Author: Zruty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-13 15:04:08

Bardzo dobrze jest używać sesji z asp.net aplikacja mvc. steve sanderson wykorzystał session for cart w przykładowej aplikacji, która pochodzi z jego książki. Kod jest dostępny tutaj

 10
Author: Muhammad Adeel Zahid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-19 08:54:38

Sesje są w porządku, ale rozważ system W Stylu Amazon, w którym otrzymujesz plik cookie rozpoznawania, nawet jeśli nie jesteś zalogowany. Dzięki temu mogą przechowywać Twój koszyk w bazie danych, z kluczem do rozpoznawania pliku cookie.

Rezultatem jest uniknięcie strasznego doświadczenia użytkownika z utratą koszyka zakupów z powodu limitu czasu sesji / recyklingu appdomain serwera (ten ostatni jest łagodzony przez użycie SQLSTATE session storage, co polecam). Użytkownik może przyjść kilka dni później ich koszyk nadal tam będzie. O ile nie jest to problem bezpieczeństwa / prywatności, uważam, że jest to lepsze rozwiązanie.

 10
Author: James McCormack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-19 09:18:23

Użyłbym sesji, chyba że były powody, aby tego uniknąć.

Na przykład, mam jeden projekt, w którym powtarzałem wywołania do akcji MVC w tle. Ta akcja służy plikowi, który jest wolny w sieci. Kiedyś używałem sesji, ale szybko odkryłem główny niekorzystny efekt: IIS nie będzie wykonywać połączeń od tego samego użytkownika równolegle, ale tylko kolejno jeden po drugim. Miało to dramatyczny wpływ na wydajność, więc zastosowałem alternatywną metodę: ustawiłem HttpContext.Użytkownik.Tożsamości do nazwy użytkownika i używać go jako klucza do pobierania rzeczy z bazy danych. Ale prawdopodobnie możesz ustawić go na jakiś losowy GUID i mieć to, aby zastąpić sesje.

 4
Author: Palantir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-19 09:02:13

Zazwyczaj używam ciasteczek z moim koszykiem z serializowanymi w base64 string to wydaje się działać całkiem dobrze

 2
Author: simonlchilds,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-19 08:54:58

W przypadku koszyka na zakupy, zdecydowanie powinieneśnie używaj stanu sesji. Dobrym podejściem jest użycie modułu anonimowej identyfikacji do zarządzania plikami cookie. Wystarczy jedna linijka web.config.

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

Następnie przy każdym żądaniu możesz użyć właściwości Request.AnonymousID (która zwraca łańcuch reprezentujący identyfikator GUID), aby wyszukać koszyk w bazie danych.

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

    // Lookup cart...

    return View();
}

Jest to nie tylko bardziej efektywne niż używanie stanu sesji, ale także prościej.

Bibliografia:

 2
Author: NightOwl888,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-14 17:54:09

W systemie koszyka produkty, które są dodawane do koszyka są bardzo ważne, więc korzystanie z sesji nie jest moim zdaniem dobrym pomysłem. Korzystanie z plików cookie i tymczasowej tabeli w bazie danych jest jednym z najlepszych pomysłów. Możemy przechowywać te dane w nieskończoność lub usuwać je po określonych dniach.

 0
Author: Ujwal Neupane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-27 08:29:06