Czy istnieje najlepsza praktyka i zalecana alternatywa dla zmiennych sesji w MVC

OK, więc po pierwsze, zanim ktoś spróbuje ustalić, że jest to" duplikat " pytanie; przejrzałem większość postów na tak dotyczące podobnych pytań, ale nawet w połączeniu z tym wszystkim, co zostało powiedziane, nadal jestem nieco w dylemacie co do ostatecznego, a może powinienem powiedzieć jednomyślne porozumienie w tej sprawie.

Mogę jednak powiedzieć ,że mam (na podstawie postów) jednoznacznie ustalone, że odpowiedź opiera się na zakresie wymogu. Ale nawet z biorąc to pod uwagę, opinie wydają mi się zbyt zróżnicowane, aby podjąć decyzję, jak powinienem sobie z tym poradzić.

Moim natychmiastowym wymogiem jest to, że muszę utrzymywać zmienne dane z 1 kontrolera w wielu widokach. Dokładniej mówiąc, mam kontroler i odpowiedni widok, który obsługuje liczbę pozycji koszyka i chciałbym zachować te dane w wielu widokach. Myślę, że widok _layout jest najbardziej logicznym wyborem.

Teraz udało mi się zrealizowano to zadanie, przypisując wartość do zmiennej sesji, która jest pobierana z widoku my _layout; więc nawet wtedy, gdy użytkownik miał nawigować w dowolnym miejscu w witrynie, liczba pozycji w Koszyku będzie utrzymywać się aż do opuszczenia witryny lub zakończenia realizacji zakupu; w takim przypadku zmienna zostanie wyczyszczona w kodzie.

Posty, które czytałem, wydawały się stronnicze, albo trzymając się z dala od zmiennych sesji na rzecz plików cookie i przechowywania danych w bazie danych; lub stwierdzając, że dla zamierzonego celu, dla którego proponuję ich używać, zmienne sesji są całkowicie w porządku w użyciu.

Inna rzecz, którą czytałem sugeruje, że zmienne sesji mogą potencjalnie utrudniać ogólną wydajność, jeśli jest duży ruch na stronie, ponieważ informacje są przechowywane na serwerze.

Osobiście nie mogę uzasadnić przechowywania tego typu informacji w bazie danych, a następnie uderzania w bazę danych, ponieważ wyobrażam sobie, że może to również wpłynąć na wydajność witryny i wydaje się nieco overkill do przechowywania danych tymczasowych. TempData, ViewData i ViewBag nie działają w utrzymywaniu danych, więc nie są logicznym wyborem dla wymogu IMO.

Jeśli istnieje inna dobrze dopasowana alternatywa dla zmiennej Sesyjnej (która działa dla mnie), Chciałbym wiedzieć, co to jest.

2 posty, które wydają się sprzeczne w celu zapewnienia najlepszych rekomendacji, pozostawiają mnie trochę zdezorientowanym.

Wady: czy jest dobrą praktyką unikanie używania stanu sesji w ASP.NET MVC? Jeśli tak, to dlaczego i jak?

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

Wydaje się, że to pytanie (choć przedstawione w wielu różnych odmianach) nie ma ostatecznej odpowiedzi, którą mogę stwierdzić.

Jeśli istnieje bardziej preferowany sposób, aby to osiągnąć bez przesady, to jest to odpowiedź, której szukam.

Czytałem gdzieś o stosowaniu filtrów MVC w tandemie z Global.sekcja startowa aplikacji ascx również, ale nie wydaje się to odpowiednie dla zmiennych ustawionych na poziomie kontrolera tak samo jak być może zmienne statyczne.

Może ktoś może zgnieść (z braku lepszego słowa) wiele różnorodnych opinii na ten temat i może dać bardziej ostateczną odpowiedź na pytanie? Jestem pewien, że różne opinie mają swoje miejsce i nie próbuję ich zdyskredytować. Ale mając ostateczną i ewentualnie jednomyślną odpowiedź byłoby lepiej; wtedy ja może sortować inne posty, aby określić, co jest najlepsze dla mojej aplikacji.

Oczywiście, jeśli to pytanie nie ma ostatecznej odpowiedzi; po prostu mi to powiedz, a postaram się uzyskać własną odpowiedź z innych postów.

Thanks

===========================================================

ZAKTUALIZOWANA ODPOWIEDŹ NA UDZIELONE ODPOWIEDZI

Buforowanie i pliki cookie wydają się być ogólną preferencją od odpowiedzi, jednak zauważyłem również stwierdzenie, że buforowanie nie jest to idealny kandydat do użycia na wielu serwerach internetowych, ponieważ synchronizacja może być potencjalnym problemem.

Przypisując Timowi, stwierdzono, że przechowywanie danych jest zoptymalizowane, a użytkownicy mają możliwość powrotu w późniejszym czasie i kontynuowania tam, gdzie przerwali.

To doskonały punkt, ale zachowując przewidywania na prawdopodobieństwach; jego prawdopodobne rozsądne biorąc pod uwagę, że niektórzy użytkownicy mogą nie wrócić pozostawiając nienaturalne dane w bazie danych.

Więc utrzymanie DB optymalizacji i clean (co "dla mnie" jest równie istotne) wymagałoby realizacji zadania konserwacyjnego, aby automatycznie wygasnąć te zapisy w oparciu o ustalony próg czasu, aby uwzględnić te okoliczności. Chociaż zadanie konserwacyjne nie jest niezaprzeczalną opcją, nadal uważam, że dodaje to nieco więcej pracy do zadania po prostu w celu służenia jako tymczasowe przechowywanie.

Niemniej jednak, szanuję rekomendację Tima i uważam, że zasługuje ona na zasługi w przeciwdziałaniu mojej początkowej opinia w pewnym stopniu; że baza danych nie wydaje się być realną opcją do przechowywania tymczasowych danych; więc myślę, że kompromisem byłoby przechowywanie danych w bazie danych (biorąc pod uwagę scenariusz koszyka lub podobne) być może po kasie. W ten sposób, jak wcześniej stwierdziłeś, dane mogą być stale śledzone podczas kolejnych wizyt, dzięki czemu masz zapis transakcji. Ale co ważniejsze, dane o tych transakcjach mają realne znaczenie, aby utrzymać się na baza danych.

Stwierdzono również, że chociaż sesja jest szybsza niż Baza Danych; ale pomimo tego, że ma swoje zastrzeżenia, które mogą być w pewnym stopniu złagodzone przez inne mechanizmy, takie jak wykorzystanie atrybutu SessionStateBehavior, służy tylko jako jeden przykład.

Ale... Myślę, że Erik pojechał do domu z efektem Dunninga-Krugera. Chociaż z treści i wyjaśnień proponowanych odpowiedzi udzielonych tutaj; poważnie wątpię w wiedzę żadnej z osób kto odpowiedział, jest wątpliwy. Niemniej jednak, mam tendencję do zgadzania się co do faktu, że uzyskanie jednomyślnej opinii może być nieco wyższe niż rozsądne oczekiwania z mojej strony.

To, czego szukałem dokładniej, to ogólny konsensus w sprawie techniki, która wygodnie zmieściłaby się w wielu różnych scenariuszach. Innymi słowy, coś, co pasuje nie tylko do mojego konkretnego scenariusza, ale także zapewni element skalowalności dla większych środowisk z potencjalnie większy ruch. W ten sposób zmiana w programowaniu byłaby albo złagodzona całkowicie, albo w najlepszym razie Minimalna.

==================================================

Podsumowanie na podstawie opinii:

  1. Zmienne sesyjne wydają się uwzględniać mniejsze scenariusze przypadków i w stosownych przypadkach, ale mają pewne potencjalne obawy dotyczące trwałości, wśród innych znaczących rozbieżności, jak stwierdził bardzo dokładnie Erik. Więc ta opcja oczywiście nie zmieści się skalowalny model.

  2. Buforowanie jest lepsze niż zmienne sesji, ale ponownie nie jest "najlepszą" opcją skalowalną ze względu między innymi na potencjalne złożoności synchronizacji w środowiskach farmy serwerów WWW, jak wcześniej wspomniano. Ale jednak opcja.

  3. Przechowywanie danych w bazie danych jest skalowalne, ale w celu tymczasowego przechowywania danych nie jest prawdopodobnie najbardziej elegancką opcją z punktu widzenia bazy danych, ponieważ wymagałaby okresowe sprzątanie. Osobiście, posiadanie silnych podstaw w koncepcjach bazodanowych na początku mojej kariery prawdopodobnie nie będzie to czymś, z czym wielu programistów prawdopodobnie się zgodzi; ale używanie bazy danych w tym celu może wystarczyć do tworzenia stron internetowych z perspektywy programistów; jednak z perspektywy rozwoju DAL i DB to (dla mnie) ma potencjał, aby zlecić dodatkowe zadanie DB, aby wymusić wydajny backend.

  4. Ciasteczka wydają się być miłe opcja posiadająca połączone "pożądane" elementy zmiennych sesji i buforowania.

==================================================

Podsumowanie

W oparciu o odpowiedzi; myślę, że pliki cookie i buforowanie wydają się być ogólnie dobrze zaokrąglone propozycje najlepszych praktyk w połączeniu z przechowywaniem bazy danych, gdy po fakcie wymagana jest ciągła trwałość; jako potencjalnie dobre kandydatury do skalowalności prezentowanych.

The ostateczny wybór między 2 wydaje się być oparty na ilości i rodzaju danych wymagających przechowywania (np. wrażliwe vs niewrażliwe i czy istnieje obawa, że klient może zmienić dane na ich końcu); oprócz szczególnych rozważań dotyczących plików cookie w tym, że mogą być one wyłączone przez klientów.

Oczywiście, nie ma jednego uniwersalnego rozwiązania, jak wyraźnie wskazano i wyciągnięto z udzielonych odpowiedzi, ale jeśli chodzi o skalowalność; mogę się mylić ale wydaje się, że są to najlepsze dostępne opcje.

Ponieważ wszystkie odpowiedzi są dobre; zamierzam uznać wszystkie posty za przydatne i zaakceptuję odpowiedź Erika jako dobrze zaokrąglone ogólne skalowalne rozwiązanie. Chciałbym móc wybrać więcej niż jedną akceptowaną odpowiedź, ponieważ uważam, że odpowiedź Tima była również bardzo dobrze ułożona i zwięzła.

Odpowiedź Gupty też była dobra, ale chciałem więcej rozwinięcia proponowanej odpowiedzi, a nie powtórzenia poprzednich postów.

Dzięki Chłopaki!

Author: Community, 2014-05-02

3 answers

Nigdy nie uzyskasz jednomyślnej opinii na temat niczego w dużej grupie ludzi. Taka jest ludzka natura. Część tego wynika z efektu Dunninga-Krugera, który stwierdza, że im mniej ktoś wie na dany temat, tym bardziej prawdopodobne jest, że zbyt ceni swoją wiedzę w tym temacie. Innymi słowy, wielu ludzi myśli, że coś wiedzą, ale tylko dlatego, że nie wiedzą, że tego nie wiedzą. Częścią tego jest po prostu to, że ludzie mają różne doświadczenia, a niektórzy odkryli żadnych problemów z sesją, podczas gdy inni mają w różnych sytuacjach, lub odwrotnie...

Tak więc, aby wykonać kopię zapasową swoich badań, które sugerują, że odpowiedź zależy w dużej mierze od wymagań, musimy zrozumieć, jakie są Twoje wymagania. Jeśli ma to być witryna o dużym natężeniu ruchu, z serwerami zrównoważonymi obciążeniem w farmie internetowej, trzymaj się z dala od sesji, jak tylko możesz. Oczywiście, możliwe jest współdzielenie sesji na różne sposoby w środowisku farmy serwerów( serwer sesji, serwer pamięci podręcznej, itd..), ale unikanie sesji będzie prawie zawsze szybsze, jeśli możesz mu pomóc.

Jeśli Twoja strona jest pojedynczym serwerem i prawdopodobnie nigdy nie będzie się rozwijać. A twoje wzorce ruchu są stosunkowo niskie, sesja może być przydatną opcją. Należy jednak zawsze mieć świadomość, że sesja jest zawodną pamięcią masową i może zniknąć w dowolnym momencie. Jeśli pula aplikacji zostanie poddana recyklingowi, sesja zniknie. Jeśli nieuwzględniony wyjątek pojawi się w procesie roboczym, sesja może zostać przerwana. If IIS uważa, że nie ma wystarczającej ilości pamięci, Twoja sesja może zniknąć, niezależnie od skonfigurowanych wartości limitu czasu. Nie zawsze można również uzyskać wiarygodne powiadomienie o zakończeniu sesji, ponieważ zakończone sesje nie uruchamiają zdarzenia Session_End.

Kolejną kwestią jest to, że sesja jest serializowana. Innymi słowy, usługa IIS uniemożliwia zapisywanie do sesji więcej niż jednego wątku naraz, a często robi to poprzez blokowanie sesji, gdy wątek jest uruchomiony, jeśli nie wybrał opcji zapisu blokowanie sesji. W niektórych przypadkach może to powodować poważne problemy, a w innych tylko słabą wydajność. Możesz to złagodzić, oznaczając różne metody z atrybutem sesji tylko do odczytu, jeśli nie zamierzasz go modyfikować w tej metodzie.

Ostatecznie, jeśli zdecydujesz się użyć sesji, spróbuj użyć jej tylko do małych, krótkotrwałych rzeczy, jeśli w ogóle to możliwe, a jeśli nie, to zbuduj w sposób "regenerujący" dane, jeśli sesja zostanie utracona. Na przykład, używając swojego numeru elementy w przykładzie koszyka, możesz napisać metodę, która najpierw sprawdza, czy wartość jest tam, a jeśli nie, to wychodzi i ładuje ją z bazy danych. Zawsze używaj tej metody, aby uzyskać dostęp do zmiennej, zamiast uzyskiwać do niej dostęp bezpośrednio z sesji... w ten sposób, jeśli sesja zostanie utracona, po prostu ją przeładuje.

Jednak, powiedziawszy to... Jeśli chodzi o liczbę pozycji w Koszyku, generalnie wolałbym użyć pliku cookie do tych informacji, Ponieważ pliki cookie są przekazywane na stronę przy każdym ładowaniu tak czy inaczej, a to jest mała Dyskretna Jednostka danych. Generalnie preferuj sesję dla poufnych danych, które chcesz uniemożliwić użytkownikowi możliwość zmiany.. liczba pozycji w koszyku po prostu nie pasuje do tej reguły.

 24
Author: Erik Funkenbusch,
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
2014-05-02 02:45:22

Kiedy

Bazy danych są wysoce zoptymalizowane. Prosta wartość, taka jak liczba koszyków, jest dobrym kandydatem do buforowania przez bazę danych i (miejmy nadzieję) tanio obliczyć. To może nie być problem.

Jeśli jednak wykluczyłeś inne mechanizmy, małe wartości dla poszczególnych użytkowników są realnymi kandydatami do sesji.

Cache jest w porządku dla wartości dla całej witryny lub wartości specyficznych dla użytkownika z unikalnymi kluczami. Jednak synchronizacja pamięci podręcznych na wielu serwerach internetowych może być trudna. Stan sesji poza procesem pozostanie zsynchronizowany, ponieważ jest przechowywany w jednej lokalizacji (baza danych lub serwer stanu).

Oczywiście istnieje wiele alternatyw buforowania stron trzecich z różnymi opcjami, aby utrzymać je zsynchronizowane.

Niezależnie od tego, gdzie liczba jest tymczasowo przechowywana, uważam, że same koszyki powinny być przechowywane w bazie danych, aby użytkownicy mieli możliwość późniejszego powrotu i kontynuowania tam, gdzie odeszli wyłącz.

Wydajność

Jeśli używasz out of process session state (np. w środowisku load balanced i/lub aby uczynić sesję trwalszą), to uderzy w bazę danych lub wywoła usługę out of process, ale wywołanie jest stosunkowo tanie, chyba że robisz serializację dużych Wykresów obiektów.

Sesja jest ładowana raz na żądanie. Późniejszy dostęp do odczytu jest bardzo szybki.

Zapis do sesji może być szkodliwy dla wydajności, nawet jeśli nie ma obciążenia. Dlaczego? najbardziej nowoczesne aplikacje używają wywołań asynchronicznych, a gdy wiele wywołań asynchronicznych trafi w obsługę HTTP (strona, kontroler itp.), która odczytuje/zapisuje sesję, ASP.Net zablokuje sesję w celu serializacji dostępu. Aby tego uniknąć, możesz ozdobić Kontrolery za pomocą [SessionState( SessionStateBehavior.ReadOnly )]

Design

Teraz udało mi się wykonać to zadanie przypisując wartość do zmiennej sesji, która jest pobierana z widoku my _layout;

Wygląda to na mieszanie obaw, tzn. posiadanie poglądu świadomy podstawowego mechanizmu przechowywania. Z purystycznego punktu widzenia, ustawiłbym tę wartość na modelu widoku lub przynajmniej umieścił ją w ViewBag. Z praktycznego punktu widzenia jedna lub dwie wartości pobrane w ten sposób prawdopodobnie niczego nie zaszkodzą, ale uważaj, aby rosła znacznie dalej.

Czytałem gdzieś o stosowaniu filtrów MVC w tandemie z globalnym.ascx sekcja startowa aplikacji również, ale nie wydaje się to właściwe dla zmiennych ustawionych na poziomie kontrolera jako jak być może, statyczne zmienne.

Zmienne statyczne mają całkowicie uzasadnione zastosowania, ale musisz je dokładnie zrozumieć lub zaryzykować poważne problemy.

Zobacz moje odpowiedzi dotyczące zmiennych statycznych w ASP.Net:

 9
Author: Tim Medora,
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
2017-05-23 12:18:00

Session alternative in different perspective:-

Gdy zachowujesz coś w sesji, łamie to podstawową zasadę w ASP.NET MVC. Możesz użyć tych opcji jako alternatywy sesji.

Jeśli twój asp.net (MVC) session do boxing unboxing na obiekcie to sprawia, że trochę obciążenia na serwerze. Wypróbuj ten pomysł

  1. Buforowanie: - przechowywanie listy lub czegoś w rodzaju dużych danych w sesji jest lepsze może zmieścić się w buforowaniu. Masz kontrolę, kiedy chcesz wygasa zamiast sesji użytkownika.

  2. Jeśli Twoja aplikacja zależy od danych JSON/Ajax, możesz użyć jakiejś funkcjonalności dostarczonej w html5 (jak WebSQL, IndexDB). nie użyje pliku cookie, dzięki czemu można zaoszczędzić trochę pracy na serwerze.

 3
Author: Anirudha Gupta,
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
2017-06-11 10:14:28