Qual è la differenza tra stateful e apolidi?


86

I libri e la documentazione sull'MVC si accumulano solo sull'uso dei termini Stateful e Stateless. Ad essere sincero, non riesco proprio a coglierne l'idea, di cosa parlano i libri. Non forniscono un esempio per comprendere nessuno dei due stati, piuttosto che dire semplicemente che HTTP è apolide e con ASP.NET MVC Microsoft lo sta seguendo. Mi sto perdendo alcune conoscenze fondamentali, poiché non riesco a capire cosa sia statale e perché sia ​​statale e lo stesso vale per gli apolidi.

Un esempio semplice e breve che parla di un controllo come pulsante o casella di testo può semplificare la comprensione, suppongo.

Risposte:


40

Stateless significa che HTTP non ha un supporto integrato per gli stati; ad es. non è possibile memorizzare se un utente ha effettuato l'accesso o fatto qualcos'altro.

La soluzione più comune è utilizzare le sessioni per superare quel problema. Ciò significa che devi essere in grado di includere un identificatore di sessione in ogni risposta o richiesta. Questo viene fatto creando un cookie di sessione o includendo l'identificatore di sessione in tutti i collegamenti.

WebForms cerca di rendere tutto ciò trasparente (usando ViewState) mentre MVC ti costringe a gestirlo manualmente.

Nel tuo esempio hai citato Pulsanti e caselle di testo. Il modo più semplice per consentire loro di mantenere il proprio stato è semplicemente quello di interrompere la pubblicazione dell'intera pagina. MVC ha ottenuto un eccellente supporto per ajax (tramite jQuery) e ti suggerisco di usare ajax se vuoi semplicemente fare qualcosa nella pagina corrente.


3
ciò significa che se accedo a un sito Web, ogni pagina che visito ricontrolla solo per l'autenticazione prima di visualizzare il contenuto tramite identificatore di sessione o cookie di sessione ??
Pankaj Upadhyay,

3
sì, è corretto.
jgauffin,

quindi gli apolidi sono migliori o peggiori?
Lucas - Better Coding Academy

1
@ think123: è più performante in quanto non è necessario gestire lo stato (ovvero il bilanciamento del carico ecc. è molto più semplice). È sempre più complesso da quando devi gestire uno stato artificiale.
jgauffin,

5
@jgauffin: Performant è la parola sbagliata qui. Stateless è meno performante poiché non hai l'opportunità di memorizzare nella cache lo stato e devi cercarlo ripetutamente. Ciò che è è più scalabile ; è qui che entra in gioco il bilanciamento del carico e i guadagni derivanti dalla scalabilità possono compensare le perdite di prestazioni quando il sistema diventa abbastanza grande.
Mason Wheeler,

108

Stateless: non esiste memoria (stato) gestita dal programma

Stateful: il programma ha una memoria (stato)

Per illustrare il concetto di stato definirò una funzione che è stateful e una che è apolide

apolide

//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;
}

Come altri hanno già detto, http è intrinsecamente apolide. Quindi lo stato deve essere integrato nelle tue applicazioni.

Immagina una richiesta sul Web in cui hai un browser client che comunica con un processo server. Per mantenere lo stato tramite il protocollo http senza stato, il browser invia in genere un identificatore di sessione al server su ogni richiesta. Per ogni richiesta il server sarà come "ah, è questo ragazzo". Le informazioni sullo stato possono quindi essere ricercate nella memoria lato server o in un database in base a questo ID sessione.

In un ambiente puramente stateless non è necessario questo ID sessione. Ogni richiesta conterrebbe tutte le informazioni che il server dovrebbe elaborare. Tuttavia, molte applicazioni devono mantenere lo stato per tenere traccia dell'autenticazione di una sessione per visualizzare determinati contenuti o per tenere traccia di ciò che un utente sta facendo. Non vorrai inviare le credenziali dell'utente via cavo per ogni richiesta.


domanda veloce: quindi se l'ID di sessione viene utilizzato (cioè rubato) da un altro utente, il server non avrebbe idea che si tratti di qualcun altro?
mihai,

4
È corretto. Esistono modi per proteggere l'identità di un utente come l'utilizzo di cookie https o httponly. Ma se il computer di un utente è compromesso, un utente malintenzionato potrebbe ingannare il server nel pensare di essere l'utente.
codificatore

2
+1 per un esempio di codice chiaro e croccante. Sono sempre più convinto che i termini IT più complessi possano essere compresi solo nel contesto.
Sebastian

La possibilità che un ID di sessione venga rubato è uno dei motivi per cui devi stare attento e applicazioni come un CMS o qualcosa come OAuth costruiscono modi per renderlo molto più difficile.
Elin,

4
Per ogni richiesta il server sarà come "ah, è questo ragazzo" - meglio dire che in ogni altro esempio che ho visto
Rafael Eyng,

69

apolide significa che non c'è memoria del passato. Ogni transazione viene eseguita come se fosse stata eseguita per la prima volta.

statefull significa che c'è memoria del passato. Le transazioni precedenti vengono ricordate e possono influire sulla transazione corrente.


9
Questo avrebbe dovuto ricevere la risposta. È di gran lunga la risposta più chiara e precisa qui.
Mawg,

3
Semplice e preciso.
Ivan Ivković,

2
È accurato per chiunque conosca già la differenza.
Rafael Eyng,

3

A mio avviso semplice, la differenza tra ASP.NET (stateful) e ASP.NET-MVC (stateless) può essere isolata dal fatto che il primo fornisce controlli sul lato server e l'altro no.

Vale la pena notare che l'approccio dei moduli Web ASP.NET è orientato alla transizione di vecchi programmatori VB e VC ++ che vengono utilizzati nel modello guidato dal modello di evento per avere un buon modo rapido di apprendere la programmazione Web seguendo lo stesso paradigma del modello di evento, come fai clic un pulsante e voilà inneschi un evento! Tutto quello che devi fare ora è scrivere il tuo codice nel gestore eventi. Per questo motivo ASP.NET doveva avere concetti come lo stato di visualizzazione e i postback per monitorare lo stato dei controlli lato server ogni round trip.

ASP.NET-MVC, tuttavia, non utilizza i controlli sul lato server, quindi non deve mantenere lo stato. Il modello MVC separa il dominio problematico in tre partizioni in modo che i dati vengano consegnati al client in modo semplificato.

In sintesi, i controlli sul lato server sono ciò che li rende diversi per quanto riguarda lo stato e l'apolidia.


1

Aggiunta alla risposta esatta @coder.

L'idea di stato è di ricordare i dati precedenti .
Ad esempio, si dispone di un controllo elenco sul server con i valori "A, B, C" e "A" è selezionato. L'elenco passa al browser client. Si seleziona "B". E rispedire al server. Come faresti a sapere se il valore è cambiato?

  • ASP.NET
    Microsoft utilizza il termine ViewState in ASP.NET. C'è un grande fraintendimento tra gli sviluppatori al riguardo.
    ViewState contiene tutto lo stato iniziale dell'elenco in <input type="hidden" value="base64 encoded" />: valori "A, B, C" e il segno "A è selezionato".
    Quindi con il browser post back invia ViewState e "B è selezionato" al server. ASP.NET ripristina lo stato iniziale dell'elenco e applica la nuova selezione "B". Questo è stato fatto per attirare gli sviluppatori di WinForms (menzionato da @Ronald). Sul server Web è possibile iscriversi per elencare le modifiche listObject.Changed += OnChanged.

  • ASP.NET MVC
    Il problema con ViewState è la dimensione. Per anni gli sviluppatori .NET hanno costretto a trasferire kilobyte di informazioni inutili, come gli stati di 20 controlli per ogni roundtrip.
    Il nuovo approccio consiste nell'inviare solo un valore "B" nuovo e piccolo.
    Oppure, se vuoi tenere traccia delle modifiche da "A" a "B", implementale da solo. Usando javascript e inviando "Was A, Now B". Oppure salva e recupera lo stato per ID in SQL Server.

  • ASP.NET MVC e ASP.NET implementano lo stato per Autenticazione e Incasso. Quindi non è corretto affermare che ASP.NET MVC sia completamente apolide.
  • La memoria menzionata nelle risposte significa "ricordare", non memoria del computer. Lo stato può essere implementato memorizzando i dati nel file system, nel server SQL o nella memoria del computer.

si prega di essere costruttivi e spiegare l'errore prima di mettere meno
Artru

0

Un'operazione stateful modifica o richiede un certo stato del sistema e un'operazione stateless no.

Esempio di una casella di testo stateful sarebbe un commento precedentemente modificato su StackExchange: la casella di testo deve visualizzare il tuo commento precedente e conoscere il post-thread con cui era coinvolto per accettare ed elaborare i tuoi input.

Un modulo di commento di posta elettronica generico con un mailto: tag sarebbe una casella di testo senza stato - accetta i tuoi input e li lancia all'applicazione di posta della tua workstation senza conservare alcuna informazione.


Anche un tipico modulo "lascia il tuo indirizzo e-mail e un messaggio e ti risponderemo" è apolide. Quando invii il modulo al server non importa da dove l'hai preso, e copia semplicemente i dati in un elenco di todo del servizio clienti e se ne dimentica.
StarWeaver,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.