Quelle est la différence entre stateful et apatride?

86

Les livres et la documentation sur le MVC ne font que s'ajouter à l'utilisation des termes Stateful et Stateless. Pour être honnête, je ne peux tout simplement pas saisir l'idée de ce dont parlent les livres. Ils ne donnent pas d'exemple pour comprendre l'un ou l'autre de ces états, plutôt que de simplement dire que HTTP est sans état et qu'avec ASP.NET MVC, Microsoft s'en tient à cela. Est-ce que je manque des connaissances fondamentales, car je ne peux pas comprendre ce qui est stateful et pourquoi?

Un exemple simple et court qui parle d’un contrôle comme un bouton ou une zone de texte peut être simplifier la compréhension, je suppose.

Pankaj Upadhyay
la source

Réponses:

40

Sans état signifie que HTTP n'a pas de prise en charge intégrée pour les états; Par exemple, vous ne pouvez pas stocker si un utilisateur s'est connecté ou a fait autre chose.

La solution la plus courante consiste à utiliser des sessions pour résoudre ce problème. Cela signifie que vous devez pouvoir inclure un identifiant de session dans chaque réponse ou demande. Pour ce faire, vous devez créer un cookie de session ou inclure l'identifiant de session dans tous les liens.

WebForms essaie de rendre tout cela transparent (à l'aide de ViewState) pendant que MVC vous oblige à le gérer manuellement.

Dans votre exemple, vous avez parlé de boutons et de zones de texte. Le moyen le plus simple de les laisser maintenir leur état est tout simplement d’arrêter de renvoyer la page entière. MVC a obtenu un excellent support pour ajax (via jQuery) et je vous suggère d'utiliser ajax si vous voulez juste faire quelque chose sur la page en cours.

Jgauffin
la source
3
cela signifie que si je suis connecté à un site Web, chaque page que je visite est juste vérifiée pour l'authentification avant de restituer le contenu via l'identifiant de session ou un cookie de session?
Pankaj Upadhyay
3
Oui c'est correct.
jgauffin
alors est-ce que l'apatridie est mieux ou pire
Lucas - Better Coding Academy
1
@ think123: Il est plus performant car vous n'avez pas à gérer l'état (l'équilibrage de la charge, etc., est beaucoup plus facile). C'est d'autant plus complexe que vous devez gérer un état artificiel.
jgauffin
5
@ jgauffin: performant est le mauvais mot ici. Stateless est moins performant car vous n'avez pas la possibilité de mettre en cache l'état et devez le rechercher à plusieurs reprises. Qu'est-ce que c'est est plus évolutif ; c'est là que l'équilibrage de la charge entre en jeu, et les avantages de l'évolutivité peuvent compenser les pertes de performances lorsque votre système devient suffisamment grand.
Mason Wheeler
108

Sans état - Il n'y a pas de mémoire (état) gérée par le programme

Stateful - Le programme a une mémoire (état)

Pour illustrer le concept d'état, je définirai une fonction qui est stateful et une qui est sans état

Apatride

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

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

Stateful

//The state is maintained by the function

private int _number = 0; //initially zero 

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

Comme d'autres l'ont dit, http est intrinsèquement sans état. Donc, l'état doit être intégré à vos applications.

Imaginez une requête sur le Web dans laquelle un navigateur client communique avec un processus serveur. Pour conserver l'état sur le protocole http sans état, le navigateur envoie généralement un identifiant de session au serveur à chaque demande. Pour chaque requête, le serveur ressemblera à "ah, c'est ce gars-là". Les informations d'état peuvent ensuite être consultées dans la mémoire côté serveur ou dans une base de données en fonction de cet identifiant de session.

Dans un environnement purement sans état, vous n'avez pas besoin de cet identifiant de session. Chaque demande contiendrait toutes les informations que le serveur devrait traiter. Cependant, de nombreuses applications doivent conserver leur état pour savoir si une session est authentifiée ou non, pour afficher certains contenus ou pour savoir ce que fait l'utilisateur. Vous ne voudriez pas envoyer les informations d'identification de l'utilisateur par le fil pour chaque demande.

codeur
la source
question rapide: si l’identifiant de session est utilisé (c’est-à-dire volé) par un autre utilisateur, le serveur n’aurait aucune idée que c’est quelqu'un d’autre?
mihai
4
C'est correct. Il existe des moyens de protéger l'identité d'un utilisateur, tels que l'utilisation de cookies https ou httponly. Mais si l'ordinateur d'un utilisateur est compromis, un attaquant pourrait duir le serveur en lui faisant croire qu'il est l'utilisateur.
codeur
2
+1 pour un exemple de code clair et croustillant. Je suis de plus en plus convaincu que les termes informatiques les plus complexes ne peuvent être compris que dans leur contexte.
Sébastien
La possibilité de vol d'un identifiant de session est l'une des raisons pour lesquelles vous devez faire attention et des applications comme un CMS ou quelque chose comme OAuth génèrent des moyens de rendre cela beaucoup plus difficile.
Elin
4
Pour chaque requête, le serveur ressemblera à "ah, c'est ce gars-là" - mieux vaut dire que dans tous les autres exemples que j'ai vus
Rafael Eyng
69

apatrides signifie qu'il n'y a pas de mémoire du passé. Chaque transaction est effectuée comme si elle était effectuée pour la toute première fois.

statefull signifie qu'il existe une mémoire du passé. Les transactions précédentes sont mémorisées et peuvent affecter la transaction en cours.

CWallach
la source
9
Cela aurait dû être attribué la réponse. C'est de loin la réponse la plus claire et la plus précise ici.
Mawg
3
Simple et précis
Ivan Ivković
2
C'est exact pour ceux qui connaissent déjà la différence.
Rafael Eyng
3

À mon avis, la différence entre ASP.NET (avec état) et ASP.NET-MVC (sans état) peut être isolée au fait que le premier fournit des contrôles côté serveur et que l’autre ne le fait pas.

Il convient de noter que l’approche des formulaires Web ASP.NET est axée sur la transition des anciens programmeurs VB et VC ++ qui sont utilisés dans le modèle piloté par le modèle d’événement pour disposer d’un moyen rapide et efficace d’apprentissage de la programmation Web en suivant le même paradigme de modèle d’événement. un bouton et voila vous déclenchez un événement! Tout ce que vous avez à faire maintenant, c’est d’écrire votre code dans le gestionnaire d’événements. En raison de cela, ASP.NET avait besoin de concepts tels que l'état d'affichage et les publications pour surveiller l'état des contrôles côté serveur à chaque aller-retour.

ASP.NET-MVC, cependant, n'utilise pas de contrôles côté serveur, il n'est donc pas nécessaire de maintenir l'état. Le modèle MVC sépare le domaine posant problème en trois partitions afin que les données soient livrées au client de manière rationalisée.

En résumé, les contrôles côté serveur sont ce qui les différencie dans la mesure où ils sont statiques et sans état.

Ronald
la source
1

Ajout à la réponse exacte de @coder.

L'idée d'état est de se souvenir des données précédentes .
Par exemple, vous avez un contrôle de liste sur le serveur avec les valeurs "A, B, C" et "A" sélectionnées. La liste va au navigateur client. Vous sélectionnez "B". Et poster de nouveau sur le serveur. Comment sauriez-vous que la valeur est changée?

  • ASP.NET
    Microsoft utilise le terme ViewState dans ASP.NET. Il existe un énorme malentendu parmi les développeurs à ce sujet.
    ViewState conserve tous les états initiaux de la liste en <input type="hidden" value="base64 encoded" />: valeurs "A, B, C" et marque "A est sélectionné".
    Ensuite, avec le postback, le navigateur envoie ViewState et "B est sélectionné" au serveur. ASP.NET restaure l'état initial de la liste et applique la nouvelle sélection "B". Cela a été fait pour attirer les développeurs WinForms (mentionné par @Ronald). Sur le serveur Web, vous pouvez vous abonner à la liste des modifications listObject.Changed += OnChanged.

  • ASP.NET MVC
    Le problème avec ViewState est la taille. Pendant des années, les développeurs .NET ont été contraints de transférer des kilo-octets d'informations inutiles, comme des états de 20 contrôles pour chaque aller-retour.
    La nouvelle approche consiste à n’envoyer que les nouvelles et petites valeurs "B".
    Ou si vous souhaitez suivre le changement de "A" à "B", mettez-le en œuvre par vous-même. Utilisation de javascript et envoi de "Was A, Now B". Ou enregistrez et récupérez l'état par ID dans SQL Server.

  • ASP.NET MVC et ASP.NET implémentent l'état d'authentification et de retrait. Il n'est donc pas correct de dire qu'ASP.NET MVC est totalement sans état.
  • La mémoire mentionnée dans les réponses signifie "se souvenir", pas la mémoire de l'ordinateur. L'état peut être implémenté en stockant des données dans le système de fichiers, le serveur SQL ou la mémoire de l'ordinateur.
Artru
la source
s'il vous plaît soyez constructif et expliquez l'erreur avant de mettre le moins
Artru
0

Une opération avec état modifie ou nécessite un état du système, contrairement à une opération sans état.

Exemple de zone de texte avec état: un commentaire précédemment modifié sur StackExchange - la zone de texte doit afficher votre commentaire précédent et connaître le post-thread dans lequel elle était impliquée pour accepter et traiter votre entrée.

Un formulaire de commentaire générique contenant une balise mailto: serait une zone de texte sans état. Il acceptera votre saisie et la jettera dans l'application de messagerie de votre poste de travail sans conserver aucune information.

lonstar
la source
Un formulaire typique "laissez votre adresse e-mail et un message et nous vous contacterons" est également apatride. Lorsque vous soumettez le formulaire, le serveur se soucie peu de savoir d'où il provient et il copie simplement les données dans une liste de tâches du service clientèle et les oublie.
StarWeaver