Qual è la differenza tra stateful e stateless?

82

I libri e la documentazione su MVC si limitano a utilizzare i termini Stateful e Stateless. Per essere onesti, non riesco 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 è senza stato e con ASP.NET MVC microsoft lo sta seguendo. Mi mancano alcune conoscenze fondamentali, perché non riesco a capire cosa è statico e perché è statico e lo stesso vale per gli apolidi.

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

    
posta Pankaj Upadhyay 15.08.2011 - 08:34
fonte

6 risposte

38

Stateless significa che HTTP non ha il supporto integrato per gli stati; per esempio. non puoi memorizzare se un utente ha effettuato l'accesso o fatto qualcos'altro.

La soluzione più comune è utilizzare le sessioni per superare questo 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'identificativo di sessione in tutti i link.

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

Nel tuo esempio hai menzionato pulsanti e caselle di testo. Il modo più semplice per consentire loro di mantenere il loro stato è semplicemente quello di smettere di postare l'intera pagina. MVC ha ottenuto un eccellente supporto per ajax (tramite jQuery) e ti suggerisco di usare ajax se vuoi fare qualcosa sulla pagina corrente.

    
risposta data 15.08.2011 - 08:38
fonte
105

Stateless - Non c'è memoria (stato) mantenuta dal programma

Stateful - Il programma ha una memoria (stato)

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

Stateless

//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 detto che http è intrinsecamente stateless. Quindi lo stato deve essere incorporato nelle tue applicazioni.

Immagina una richiesta sul web in cui hai un browser client che comunica con un processo del server. Per mantenere lo stato tramite il protocollo http stateless, il browser invierà in genere un identificativo di sessione al server per ogni richiesta. Per ogni richiesta il server sarà come "ah, è questo ragazzo". Le informazioni di stato possono quindi essere ricercate nella memoria lato server o in un database basato su questo ID di sessione.

In un ambiente prettamente stateless non avresti bisogno di questo ID di sessione. Ogni richiesta conterrebbe tutte le informazioni che il server dovrebbe elaborare. Ma molte applicazioni devono mantenere lo stato per tenere traccia di se una sessione è autenticata o meno per visualizzare determinati contenuti o per tenere traccia di ciò che un utente sta facendo. Non vorrai inviare credenziali utente sul filo per ogni richiesta.

    
risposta data 27.06.2012 - 19:08
fonte
67

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

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

    
risposta data 27.06.2012 - 20:32
fonte
3

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

Vale la pena notare che l'approccio dei moduli Web ASP.NET è orientato verso la transizione dei vecchi programmatori VB e VC ++ che vengono utilizzati nel modello basato sul modello di evento per avere un buon modo rapido di apprendere la programmazione web seguendo lo stesso paradigma del modello di eventi, come fai clic su un pulsante e voilà fai scattare un evento! Tutto quello che devi fare ora è scrivere il tuo codice nel gestore di eventi. A causa di ciò ASP.NET aveva bisogno di avere concetti come lo stato di visualizzazione e i postback per monitorare lo stato del lato server controlla 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 nelle tre partizioni in modo che i dati vengano consegnati al client in modo semplificato.

In sintesi, i controlli lato server sono ciò che li rende diversi in quanto statici e stateless.

    
risposta data 15.08.2011 - 10:08
fonte
1

Aggiunta alla risposta esatta di @coder.

L'idea di stato è di ricordare dati precedenti .
Ad esempio, hai un controllo elenco sul server con i valori "A, B, C" e "A" è selezionato. L'elenco va al browser client. Si seleziona "B". E inviare di nuovo al server. Come sapresti che il valore è cambiato?

  • ASP.NET
    Microsoft usa il termine ViewState in ASP.NET. C'è un enorme malinteso tra gli sviluppatori su questo.
    ViewState contiene tutto lo stato iniziale dell'elenco in <input type="hidden" value="base64 encoded" /> : valori "A, B, C" e contrassegna "A è selezionato".
    Quindi con il browser postback invia ViewState e "B è selezionato" sul server. ASP.NET ripristina lo stato iniziale dell'elenco e applica la nuova selezione "B". Questo è stato fatto per attirare gli sviluppatori WinForms (citato da @ Ronald). Sul server web puoi iscriverti alla lista cambia listObject.Changed += OnChanged .

  • ASP.NET MVC
    Il problema con ViewState è la dimensione. Per anni sviluppatori .NET costretti a trasferire kilobyte di informazioni inutili, come gli stati di 20 controlli per ogni roundtrip.
    Il nuovo approccio è di inviare solo il valore "B" nuovo e piccolo.
    O se vuoi tenere traccia del cambiamento da "A" a "B", quindi implementalo da solo. Utilizzando javascript e inviando "Was A, Now B". Oppure salva e recupera lo stato per ID in SQL Server.

  • ASP.NET MVC e ASP.NET implementa lo stato per l'autenticazione e l'incasso. Quindi non è corretto dire che ASP.NET MVC è completamente senza stato.
  • Memoria menzionata nelle risposte significa "memoria", non memoria del computer. Lo stato può essere implementato memorizzando i dati in File system, SQL Server o Computer Memory.
risposta data 07.08.2015 - 12:20
fonte
0

Un'operazione stateful modifica o richiede alcuni stati del sistema e l'operazione senza stato non lo fa.

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

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

    
risposta data 27.06.2012 - 16:58
fonte

Leggi altre domande sui tag