web-dev-qa-db-fra.com

Quelle est la différence entre un état et un apatride?

Les livres et la documentation sur le MVC ne demandent qu'à utiliser les termes avec état et sans état. Pour être honnête, je suis tout simplement incapable de saisir l'idée de ce dont les livres parlent. Ils ne donnent pas d'exemple pour comprendre l'un des deux états, plutôt que de simplement dire que HTTP est sans état et avec ASP.NET MVC, Microsoft l'accepte. Suis-je en train de manquer certaines connaissances fondamentales, car je ne peux pas comprendre ce qui est avec état et pourquoi est avec état et il en va de même pour les apatrides.

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

90
Pankaj Upadhyay

Sans état signifie que HTTP n'a pas de support intégré 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 surmonter ce problème. Cela signifie que vous devez pouvoir inclure un identifiant de session dans chaque réponse ou demande. Cela se fait soit en créant un cookie de session, soit en incluant l'identifiant de session dans tous les liens.

WebForms essaie de rendre tout cela transparent (en utilisant ViewState) tandis que MVC vous oblige à le gérer manuellement.

Dans votre exemple, vous avez mentionné les boutons et les zones de texte. Le moyen le plus simple de les laisser maintenir leur état consiste simplement à arrêter de publier la page entière. MVC a 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 actuelle.

41
jgauffin

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

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

Pour illustrer le concept d'état, je définirai une fonction qui est avec état 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;
}

Avec état

//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 apatride. L'état doit donc être intégré à vos applications.

Imaginez une demande sur le Web où vous avez un navigateur client communiquant avec un processus serveur. Pour maintenir l'état sur le protocole http sans état, le navigateur envoie généralement un identifiant de session au serveur à chaque demande. Pour chaque demande, le serveur sera comme "ah, c'est ce mec". Les informations d'état peuvent ensuite être recherché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'auriez pas besoin de cet identifiant de session. Chaque demande contiendrait toutes les informations dont le serveur aurait besoin pour traiter. Mais de nombreuses applications doivent conserver leur état pour savoir si une session est authentifiée ou non pour afficher certains contenus ou pour suivre ce que fait un utilisateur. Vous ne voudriez pas envoyer les informations d'identification utilisateur par câble pour chaque demande.

111
coder

apatride 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 y a une mémoire du passé. Les transactions précédentes sont mémorisées et peuvent affecter la transaction en cours.

70
CWallach

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

Il convient de noter que l'approche des formulaires Web ASP.NET est orientée vers 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 avoir un bon moyen rapide d'apprendre la programmation Web après le même paradigme de modèle d'événement, comme si vous cliquez sur un bouton et que vous déclenchez un événement! Tout ce que vous avez à faire maintenant est d'écrire votre code dans le gestionnaire d'événements. En raison de cela, ASP.NET devait avoir des concepts comme l'état d'affichage et les publications à surveiller l'état du côté serveur contrôle chaque aller-retour.

ASP.NET-MVC, cependant, n'utilise pas de contrôles côté serveur, il n'a donc pas à maintenir son état. Le modèle MVC sépare le domaine problématique 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 rend différents dans la mesure où ils sont avec état et sans état.

3
Ronald

Ajout à @coder réponse exacte.

L'idée d'état est de rappelez-vous les 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" est sélectionné. La liste va au navigateur client. Vous sélectionnez "B". Et postez sur le serveur. Comment sauriez-vous que la valeur est modifiée?

  • ASP.NET
    Microsoft utilise le terme ViewState dans ASP.NET. Il y a un énorme malentendu parmi les développeurs à ce sujet.
    ViewState contient tout l'état initial de la liste dans <input type="hidden" value="base64 encoded" />: les valeurs "A, B, C" et la marque "A est sélectionné".
    Ensuite, avec le navigateur de retour, ViewState envoie 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 de WinForms (mentionné par @Ronald). Sur le serveur Web, vous pouvez vous abonner aux modifications de la liste 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 à envoyer uniquement une nouvelle et petite valeur "B".
    Ou si vous souhaitez suivre le changement de "A" à "B", implémentez-le par vous-même. Utiliser javascript et envoyer "Was A, Now B". Ou enregistrez et récupérez l'état par ID dans SQL Server.

  • ASP.NET MVC et ASP.NET implémente l'état pour l'authentification et l'encaissement. Il n'est donc pas correct de dire qu'ASP.NET MVC est totalement sans état.
  • Mémoire mentionné dans les réponses signifie "se souvenir", pas de mémoire d'ordinateur. L'état peut être implémenté en stockant les données dans le système de fichiers, le serveur SQL ou la mémoire de l'ordinateur.
1
Artru

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

Un exemple d'une zone de texte avec état serait 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 avec lequel il était impliqué pour accepter et traiter votre entrée.

Un formulaire générique de commentaire par e-mail avec une balise mailto: serait une zone de texte sans état - il accepte votre entrée et la lance dans l'application de messagerie de votre poste de travail sans conserver aucune information.

0
lonstar