Jaka jest różnica między stanowym a bezpaństwowcem?

86

Książki i dokumentacja na temat MVC po prostu stosują warunki stanowe i bezpaństwowe. Szczerze mówiąc, nie jestem w stanie pojąć, o czym mówią książki. Nie podają żadnego przykładu, aby zrozumieć którykolwiek z tych stanów, zamiast po prostu powiedzieć, że HTTP jest bezstanowy i wraz z ASP.NET MVC microsoft się z nim zgadza. Czy brakuje mi podstawowej wiedzy, ponieważ nie rozumiem, co jest stanowe i dlaczego jest stanowe, a to samo dotyczy bezpaństwowców.

Prosty i krótki przykład, który mówi o kontrolce, takiej jak przycisk lub pole tekstowe, może uprościć zrozumienie, jak sądzę.

Pankaj Upadhyay
źródło

Odpowiedzi:

40

Bezstanowy oznacza, że ​​HTTP nie ma wbudowanej obsługi stanów; np. nie możesz zapisać, czy użytkownik zalogował się lub zrobił coś innego.

Najczęstszym rozwiązaniem jest użycie sesji w celu przezwyciężenia tego problemu. Oznacza to, że musisz być w stanie dołączyć identyfikator sesji do każdej odpowiedzi lub żądania. Można to zrobić, tworząc plik cookie sesji lub umieszczając identyfikator sesji we wszystkich linkach.

WebForms próbuje uczynić wszystko tak przezroczystym (przy użyciu ViewState), podczas gdy MVC zmusza cię do obsługi go ręcznie.

W swoim przykładzie wspomniałeś Buttons i TextBoxes. Najłatwiejszym sposobem na utrzymanie stanu jest po prostu zaprzestanie wysyłania całej strony. MVC ma doskonałe wsparcie dla ajax (poprzez jQuery) i sugeruję, abyś używał ajax, jeśli po prostu chcesz coś zrobić na bieżącej stronie.

jgauffin
źródło
3
oznacza to, że jeśli jestem zalogowany na stronie, każda odwiedzana strona ponownie sprawdza autentyczność przed renderowaniem treści za pomocą identyfikatora sesji lub pliku cookie sesji?
Pankaj Upadhyay
3
tak, to jest poprawne.
jgauffin,
więc czy bezpaństwowiec jest lepszy czy gorszy?
Lucas - Better Coding Academy
1
@ think123: Jest bardziej wydajny, ponieważ nie musisz zarządzać stanem (tzn. równoważenie obciążenia itp. jest o wiele łatwiejsze). To jest coraz bardziej złożone, ponieważ musisz zarządzać sztucznym stanem.
jgauffin
5
@jgauffin: Performant to niewłaściwe słowo. Bezstanowy jest mniej wydajny, ponieważ nie masz możliwości buforowania stanu i wielokrotnego sprawdzania stanu. To, co jest, jest bardziej skalowalne ; właśnie tam pojawia się równoważenie obciążenia, a zyski ze skalowalności mogą zrównoważyć straty wydajności, gdy twój system staje się wystarczająco duży.
Mason Wheeler,
108

Bezstanowy - program nie utrzymuje pamięci (stanu)

Stanowy - program ma pamięć (stan)

Aby zilustrować pojęcie stanu, zdefiniuję funkcję, która jest stanowa i taka, która jest bezpaństwowa

Bezpaństwowiec

//The state is derived by what is passed into the function

function int addOne(int number)
{
    return number + 1;
}

Stanowy

//The state is maintained by the function

private int _number = 0; //initially zero 

function int addOne()
{
    _number++;
    return _number;
}

Jak powiedzieli inni, http jest z natury bezpaństwowcem. Więc stan musi być wbudowany w twoje aplikacje.

Wyobraź sobie żądanie przez Internet, w którym przeglądarka klienta komunikuje się z procesem serwera. Aby utrzymać stan przez bezstanowy protokół HTTP, przeglądarka zazwyczaj wysyła identyfikator serwera do każdego żądania. Dla każdego żądania serwer będzie przypominał „ah, to ten facet”. Informacje o stanie można następnie wyszukać w pamięci po stronie serwera lub w bazie danych na podstawie tego identyfikatora sesji.

W środowisku czysto bezstanowym nie potrzebujesz tego identyfikatora sesji. Każde żądanie zawierałoby wszystkie informacje, które serwer musiałby przetworzyć. Ale wiele aplikacji musi utrzymywać stan, aby śledzić, czy sesja jest uwierzytelniana, aby wyświetlać określone treści lub śledzić to, co robi użytkownik. Nie chcesz wysyłać danych uwierzytelniających użytkownika za pośrednictwem drutu dla każdego żądania.

koder
źródło
szybkie pytanie: więc jeśli identyfikator sesji zostanie użyty (tzn. skradziony) przez innego użytkownika, serwer nie miałby pojęcia, że ​​to ktoś inny?
mihai
4
To jest poprawne. Istnieją sposoby ochrony tożsamości użytkownika, takie jak używanie plików cookie https lub httponly. Ale jeśli komputer użytkownika zostanie przejęty, osoba atakująca może oszukać serwer, aby myślał, że jest użytkownikiem.
koder
2
+1 za wyraźny i chrupiący przykład kodu. Coraz bardziej jestem przekonany, że najbardziej złożone terminy IT można zrozumieć tylko w kontekście.
Sebastian,
Możliwość kradzieży identyfikatora sesji jest jednym z powodów, dla których musisz zachować ostrożność, a aplikacje takie jak CMS lub coś takiego jak OAuth budują na wiele sposobów, aby utrudnić to.
Elin,
4
Dla każdego żądania serwer będzie przypominał „ah, to ten facet” - lepiej powiedzieć, że w każdym innym przykładzie, jaki widziałem
Rafael Eyng
69

bezpaństwowiec oznacza, że ​​nie ma pamięci o przeszłości. Każda transakcja jest wykonywana tak, jakby była wykonywana po raz pierwszy.

statefull oznacza, że ​​istnieje pamięć przeszłości. Poprzednie transakcje są zapamiętywane i mogą mieć wpływ na bieżącą transakcję.

CWallach
źródło
9
To powinno było otrzymać odpowiedź. To zdecydowanie najczystsza i najdokładniejsza odpowiedź tutaj.
Mawg
3
Prosty i dokładny.
Ivan Ivković
2
Jest dokładny dla każdego, kto już zna różnicę.
Rafael Eyng
3

W mojej prostej opinii różnicę między ASP.NET (stanowy) i ASP.NET-MVC (bezstanowy) można oddzielić od faktu, że pierwszy zapewnia kontrolę po stronie serwera, a drugi nie.

Warto zauważyć, że podejście do formularzy internetowych ASP.NET jest ukierunkowane na przekształcanie starych programistów VB i VC ++, którzy są wykorzystywani w modelu opartym na modelu zdarzeń, aby mieć dobry szybki sposób uczenia się programowania internetowego zgodnie z tym samym paradygmatem modelu zdarzeń, tak jak kliknięcie przycisk i voila wywołujesz zdarzenie! Wszystko, co musisz teraz zrobić, to napisać kod w module obsługi zdarzeń. Z tego powodu ASP.NET musiał mieć takie koncepcje, jak stan widoku i informacje zwrotne, aby monitorować stan kontrolek po stronie serwera podczas każdej podróży.

Jednak ASP.NET-MVC nie używa kontrolek po stronie serwera, więc nie musi utrzymywać stanu. Model MVC dzieli domenę problemów na trzy partycje, dzięki czemu dane są dostarczane do klienta w sposób usprawniony.

Podsumowując, elementy sterujące po stronie serwera wyróżniają je pod względem stanu i bezstanowości.

Ronald
źródło
1

Dodatek do dokładnej odpowiedzi na @coder.

Ideą stanu jest zapamiętywanie poprzednich danych .
Na przykład, masz kontrolę listy na serwerze z wybranymi wartościami „A, B, C” i „A”. Lista trafia do przeglądarki klienta. Wybierz „B”. I prześlij z powrotem na serwer. Skąd wiesz, że wartość została zmieniona?

  • ASP.NET
    Microsoft używa terminu ViewState w ASP.NET. Istnieje ogromne nieporozumienie wśród programistów na ten temat.
    ViewState przechowuje wszystkie początkowe stany listy <input type="hidden" value="base64 encoded" />: wartości „A, B, C” i znak „Wybrano A”.
    Następnie przeglądarka przesyła pocztą ViewState i „B jest wybrany” na serwer. ASP.NET przywraca początkowy stan listy i stosuje nowy wybór „B”. Zrobiono to, aby zwabić programistów WinForms (wspomniane przez @Ronald). Na serwerze WWW możesz subskrybować listę zmian listObject.Changed += OnChanged.

  • ASP.NET MVC
    Problemem z ViewState jest rozmiar. Przez lata programiści .NET zmuszali do przesyłania kilobajtów bezużytecznych informacji, takich jak stany 20 elementów sterujących dla każdej podróży.
    Nowe podejście polega na wysyłaniu tylko nowej i małej wartości „B”.
    Lub jeśli chcesz śledzić zmianę z „A” na „B”, zaimplementuj ją samodzielnie. Korzystanie z javascript i wysyłanie „Was A, Now B”. Lub zapisz i pobierz stan według identyfikatora w SQL Server.

  • ASP.NET MVC i ASP.NET implementują stan uwierzytelniania i płatności. Nie można więc powiedzieć, że ASP.NET MVC jest w pełni bezstanowy.
  • Pamięć wymieniona w odpowiedziach oznacza „zapamiętywanie”, a nie pamięć komputera. Stan można zaimplementować, przechowując dane w systemie plików, serwerze SQL lub pamięci komputera.
Artru
źródło
bądź konstruktywny i wyjaśnij błąd przed umieszczeniem minus
Artru
0

Operacja stanowa modyfikuje lub wymaga pewnego stanu systemu, a operacja bezstanowa nie.

Przykładem stanowego pola tekstowego byłby wcześniej edytowany komentarz na StackExchange - pole tekstowe musi wyświetlać twój poprzedni komentarz i znać wątek, w którym był zaangażowany, aby zaakceptować i przetworzyć twoje dane wejściowe.

Ogólny formularz komentarza z tagiem mailto: byłby bezstanowym polem tekstowym - przyjmuje dane wejściowe i przekazuje je do aplikacji pocztowej stacji roboczej bez zachowania jakichkolwiek informacji.

lonstar
źródło
Typowy formularz „zostaw swój adres e-mail i wiadomość, a my skontaktujemy się z Tobą” również jest bezstanowy. Po przesłaniu formularza serwer nie przejmuje się tym, skąd go otrzymałeś, a on po prostu kopiuje dane do listy czynności obsługi klienta i zapomina o tym.
StarWeaver,