Was ist der Unterschied zwischen staatlich und staatenlos?

86

In den Büchern und der Dokumentation der MVC werden nur noch die Begriffe Stateful und Stateless verwendet. Um ehrlich zu sein, kann ich einfach nicht verstehen, wovon die Bücher sprechen. Sie geben kein Beispiel, um einen der beiden Zustände zu verstehen, anstatt nur zu sagen, dass HTTP zustandslos ist und mit ASP.NET MVC Microsoft mitmacht. Fehlt mir etwas grundlegendes Wissen, da ich nicht verstehen kann, was zustandsbehaftet ist und warum zustandsbehaftet ist und dasselbe für Staatenlose gilt?

Ein einfaches und kurzes Beispiel, das sich auf ein Steuerelement wie eine Schaltfläche oder ein Textfeld bezieht, kann das Verständnis vereinfachen.

Pankaj Upadhyay
quelle

Antworten:

40

Statuslos bedeutet, dass HTTP keine Unterstützung für Status integriert hat. Sie können z. B. nicht speichern, wenn sich ein Benutzer angemeldet oder etwas anderes getan hat.

Die häufigste Lösung besteht darin, Sitzungen zu verwenden, um dieses Problem zu beheben. Dies bedeutet, dass Sie in der Lage sein müssen, eine Sitzungskennung in jede Antwort oder Anforderung aufzunehmen. Dies erfolgt entweder durch Erstellen eines Sitzungscookies oder durch Einfügen der Sitzungskennung in alle Links.

WebForms versucht, all das transparent zu machen (mithilfe von ViewState), während MVC Sie dazu zwingt, es manuell zu verarbeiten.

In Ihrem Beispiel haben Sie Buttons und TextBoxes erwähnt. Die einfachste Möglichkeit, den Status beizubehalten, besteht darin, nicht mehr die gesamte Seite zurückzusenden. MVC hat hervorragende Unterstützung für Ajax (durch jQuery) und ich schlage vor, dass Sie Ajax verwenden, wenn Sie nur etwas auf der aktuellen Seite tun möchten.

jgauffin
quelle
3
Das bedeutet, wenn ich auf einer Website angemeldet bin, überprüft jede Seite, die ich besuche, nur die Authentifizierung, bevor der Inhalt über die Sitzungs-ID oder ein Sitzungs-Cookie wiedergegeben wird.
Pankaj Upadhyay
3
ja das ist richtig.
jgauffin
also ist staatenlos besser oder schlechter?
Lucas - Better Coding Academy
1
@ think123: Es ist performanter, da Sie den Status nicht verwalten müssen (dh Load Balancing usw. ist viel einfacher). Es ist immer komplexer, da Sie einen künstlichen Zustand verwalten müssen.
Jgauffin
5
@jgauffin: Performant ist hier das falsche Wort. Statuslos ist weniger performant, da Sie nicht die Möglichkeit haben, den Status zwischenzuspeichern und ihn wiederholt nachzuschlagen. Was es ist, ist skalierbarer ; Hier kommt der Lastausgleich ins Spiel, und die Vorteile der Skalierbarkeit können die Leistungseinbußen ausgleichen, wenn Ihr System groß genug wird.
Mason Wheeler
108

Zustandslos - Es gibt keinen Speicher (Status), der vom Programm verwaltet wird

Stateful - Das Programm hat einen Speicher (Zustand)

Um das Konzept des Zustands zu veranschaulichen, werde ich eine Funktion definieren, die zustandsbehaftet und zustandslos ist

Staatenlos

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

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

Staatsbürgerlich

//The state is maintained by the function

private int _number = 0; //initially zero 

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

Wie andere gesagt haben, ist http von Natur aus zustandslos. Der Status muss also in Ihre Anwendungen integriert werden.

Stellen Sie sich eine Anfrage über das Web vor, bei der ein Client-Browser mit einem Server-Prozess kommuniziert. Um den Status über das zustandslose HTTP-Protokoll aufrechtzuerhalten, sendet der Browser bei jeder Anforderung in der Regel eine Sitzungs-ID an den Server. Für jede Anfrage wird der Server wie "ah, es ist dieser Typ" sein. Statusinformationen können dann im serverseitigen Speicher oder in einer Datenbank basierend auf dieser Sitzungs-ID nachgeschlagen werden.

In einer Umgebung ohne Status benötigen Sie diese Sitzungs-ID nicht. Jede Anfrage würde alle Informationen enthalten, die der Server verarbeiten müsste. Viele Anwendungen müssen jedoch den Status beibehalten, um zu verfolgen, ob eine Sitzung authentifiziert ist oder nicht, um bestimmte Inhalte anzuzeigen oder um zu verfolgen, was ein Benutzer gerade tut. Sie möchten Benutzeranmeldeinformationen nicht für jede Anforderung drahtlos senden.

Kodierer
quelle
kurze frage: also wenn die sitzungs-id von einem anderen benutzer verwendet (dh gestohlen) wird, hätte der server keine ahnung, dass dies jemand anderes ist?
Mihai
4
Das ist richtig. Es gibt Möglichkeiten, die Identität eines Benutzers zu schützen, z. B. durch Verwendung von https- oder httponly-Cookies. Wenn jedoch der Computer eines Benutzers kompromittiert wird, kann ein Angreifer den Server täuschen, er sei der Benutzer.
Kodierer
2
+1 für ein klares und knackiges Codebeispiel. Ich bin immer mehr davon überzeugt, dass die komplexesten IT-Begriffe nur im Kontext verstanden werden können.
Sebastian
Die Möglichkeit, dass eine Sitzungs-ID gestohlen wird, ist ein Grund dafür, dass Sie vorsichtig sein müssen und Anwendungen wie ein CMS oder etwas wie OAuth eine Möglichkeit bieten, dies erheblich zu erschweren.
Elin
4
Für jede Anfrage sieht der Server wie folgt aus: "Ah, es ist dieser Typ" - besser gesagt, in jedem anderen Beispiel, das ich gesehen habe
Rafael Eyng
69

Staatenlos heißt, es gibt keine Erinnerung an die Vergangenheit. Jede Transaktion wird so ausgeführt, als würde sie zum ersten Mal ausgeführt.

statefull bedeutet, dass es eine Erinnerung an die Vergangenheit gibt. Vorherige Transaktionen werden gespeichert und können sich auf die aktuelle Transaktion auswirken.

CWallach
quelle
9
Dies hätte die Antwort erhalten sollen. Dies ist bei weitem die klarste und präziseste Antwort.
Mawg
3
Einfach und genau.
Ivan Ivković
2
Es ist genau für alle, die den Unterschied bereits kennen.
Rafael Eyng
3

Meiner einfachen Meinung nach kann der Unterschied zwischen ASP.NET (Stateful) und ASP.NET-MVC (Stateless) auf die Tatsache beschränkt werden, dass das erste serverseitige Steuerelemente bereitstellt und das andere nicht.

Es ist erwähnenswert, dass der ASP.NET-Ansatz für Webformulare darauf abzielt, alte VB- und VC ++ - Programmierer, die im ereignismodellgesteuerten Modell verwendet werden, zu überführen, um auf einfache Weise die Webprogrammierung nach dem gleichen Ereignismodell-Paradigma wie beim Klicken zu erlernen ein knopf und voila du löst ein ereignis aus! Jetzt müssen Sie nur noch Ihren Code in den Event-Handler schreiben. Aus diesem Grund musste ASP.NET über Konzepte wie Ansichtsstatus und Postbacks verfügen, um den Status der serverseitigen Steuerelemente für jeden Roundtrip zu überwachen.

ASP.NET-MVC verwendet jedoch keine serverseitigen Steuerelemente, sodass der Status nicht beibehalten werden muss. Das MVC-Modell teilt die Problemdomäne in drei Partitionen auf, sodass die Daten rationalisiert an den Client übermittelt werden.

Zusammenfassend lässt sich sagen, dass die serverseitigen Steuerelemente sich insofern unterscheiden, als sie statusbehaftet und zustandslos sind.

Ronald
quelle
1

Zusatz zu @coder genaue Antwort.

Die Idee des Staates ist, sich an frühere Daten zu erinnern .
Beispielsweise haben Sie auf dem Server ein Listensteuerelement mit den Werten "A, B, C" und "A" ausgewählt. Die Liste geht an den Client-Browser. Sie wählen "B". Und poste zurück auf den Server. Woher wissen Sie, dass sich der Wert ändert?

  • ASP.NET
    Microsoft verwendet in ASP.NET den Begriff ViewState . Es gibt ein großes Missverständnis unter den Entwicklern.
    ViewState enthält den gesamten Anfangszustand der Liste in <input type="hidden" value="base64 encoded" />: Werten "A, B, C" und der Markierung "A ist ausgewählt".
    Dann sendet der Post-Back-Browser ViewState und "B ist ausgewählt" an den Server. ASP.NET stellt den Anfangszustand der Liste wieder her und wendet die neue Auswahl "B" an. Dies geschah, um WinForms-Entwickler anzulocken (von @Ronald erwähnt). Auf dem Webserver können Sie Listenänderungen abonnieren listObject.Changed += OnChanged.

  • ASP.NET MVC
    Das Problem mit ViewState ist die Größe. Seit Jahren sind .NET-Entwickler gezwungen, Kilobyte nutzloser Informationen zu übertragen, z. B. Zustände von 20 Steuerelementen für jede Rundreise.
    Der neue Ansatz besteht darin, nur einen neuen und kleinen "B" -Wert zu senden.
    Oder wenn Sie den Wechsel von "A" nach "B" verfolgen möchten, implementieren Sie ihn selbst. Verwenden Sie Javascript und senden Sie "Was A, Now B". Oder speichern Sie den Status und rufen Sie ihn über die ID in SQL Server ab.

  • ASP.NET MVC und ASP.NET implementieren den Status für Authentifizierung und Auszahlung. Es ist also nicht richtig zu sagen, dass ASP.NET MVC vollständig zustandslos ist.
  • Der in den Antworten erwähnte Speicher bedeutet "Erinnern", nicht Computerspeicher. Der Status kann durch Speichern von Daten im Dateisystem, SQL Server oder Computerspeicher implementiert werden.
Artru
quelle
Bitte seien Sie konstruktiv und erklären Sie Fehler, bevor Sie Minus setzen
Artru
0

Eine zustandsbehaftete Operation ändert oder erfordert einen bestimmten Zustand des Systems, eine zustandslose Operation nicht.

Ein Beispiel für ein statusbehaftetes Textfeld wäre ein zuvor bearbeiteter Kommentar in StackExchange. Das Textfeld muss Ihren vorherigen Kommentar anzeigen und den Post-Thread kennen, mit dem es verknüpft war, um Ihre Eingabe zu akzeptieren und zu verarbeiten.

Ein generisches E-Mail-Kommentarformular mit einem mailto: -Tag ist ein zustandsloses Textfeld. Es akzeptiert Ihre Eingaben und gibt sie an die E-Mail-Anwendung Ihrer Workstation weiter, ohne dass Informationen gespeichert werden.

Lonstar
quelle
Ein typisches Formular "Hinterlassen Sie Ihre E-Mail-Adresse und eine Nachricht und wir melden uns bei Ihnen" ist ebenfalls zustandslos. Wenn Sie das Formular absenden, ist es dem Server egal, woher Sie es beziehen. Er kopiert die Daten einfach in eine Kundendienst-ToDo-Liste und vergisst sie.
StarWeaver