Qual é a diferença entre stateful e stateless?

82

Os livros e a documentação do MVC simplesmente são usados com os termos Stateful e Stateless. Para ser honesto, eu simplesmente não consigo entender a ideia do que os livros estão falando. Eles não dão um exemplo para entender qualquer um dos estados, em vez de apenas dizer que o HTTP é sem estado e com a ASP.NET MVC, a microsoft está indo junto com ele. Estou faltando algum conhecimento fundamental, como eu não consigo entender o que é stateful e por que é stateful e mesmo vale para os apátridas.

Um exemplo simples e curto que fala sobre um controle como botão ou caixa de texto pode simplificar o entendimento, suponho.

    
por Pankaj Upadhyay 15.08.2011 / 08:34
fonte

6 respostas

38

Sem estado significa que o HTTP não tem suporte para estados; por exemplo. você não pode armazenar se um usuário tiver feito login ou feito outra coisa.

A solução mais comum é usar sessões para superar esse problema. Isso significa que você precisa incluir um identificador de sessão em cada resposta ou solicitação. Isso é feito criando um cookie de sessão ou incluindo o identificador de sessão em todos os links.

O WebForms tenta tornar tudo transparente (usando o ViewState) enquanto o MVC força você a manipulá-lo manualmente.

No seu exemplo, você mencionou Buttons e TextBoxes. A maneira mais fácil de deixá-los manter seu estado é simplesmente parar de postar de volta a página inteira. O MVC obteve um excelente suporte para o ajax (através do jQuery) e eu sugiro que você use o ajax se você quer apenas fazer algo na página atual.

    
por 15.08.2011 / 08:38
fonte
105

Sem estado - Não há memória (estado) mantida pelo programa

com estado - o programa tem uma memória (estado)

Para ilustrar o conceito de estado, definirei uma função com estado e outra sem estado

Sem estado

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

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

com estado

//The state is maintained by the function

private int _number = 0; //initially zero 

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

Como outros já disseram, o http é inerentemente sem estado. Então, o estado deve ser construído em seus aplicativos.

Imagine uma solicitação pela web na qual você tem um navegador cliente se comunicando com um processo do servidor. Para manter o estado sobre o protocolo http sem estado, o navegador enviará normalmente um identificador de sessão ao servidor em cada solicitação. Para cada pedido, o servidor será como "ah, é esse cara". As informações de estado podem então ser consultadas na memória do lado do servidor ou em um banco de dados com base nesse ID de sessão.

Em um ambiente puramente sem estado, você não precisaria desse id de sessão. Cada solicitação conteria todas as informações que o servidor precisaria processar. Mas muitos aplicativos precisam manter o estado para saber se uma sessão é ou não autenticada para exibir determinado conteúdo ou para acompanhar o que um usuário está fazendo. Você não deseja enviar credenciais de usuário pela rede para cada solicitação.

    
por 27.06.2012 / 19:08
fonte
67

apátrida significa que não há memória do passado. Cada transação é realizada como se estivesse sendo feita pela primeira vez.

statefull significa que existe memória do passado. Transações anteriores são lembradas e podem afetar a transação atual.

    
por 27.06.2012 / 20:32
fonte
3

Na minha opinião simples, a diferença entre o ASP.NET (stateful) e o ASP.NET-MVC (stateless) pode ser isolada ao fato de que o primeiro fornece controles no lado do servidor e o outro não.

Vale notar que a abordagem de formulários da Web do ASP.NET é voltada para a transição de programadores VB e VC ++ antigos que são usados no modelo de modelo de evento para ter uma maneira rápida de aprender a programação da Web seguindo o mesmo paradigma de modelo de evento. como você clica em um botão e voila você ativa um evento! Tudo o que você precisa fazer agora é escrever seu código no manipulador de eventos. Por causa disso, o ASP.NET precisava ter conceitos como estado de exibição e postbacks para monitorar o estado do lado do servidor, controlando cada viagem de ida e volta.

O ASP.NET-MVC, no entanto, não usa controles do lado do servidor para não precisar manter o estado. O modelo MVC separa o domínio do problema nas três partições para que os dados sejam entregues ao cliente de maneira simplificada.

Em resumo, os controles do lado do servidor são o que os torna diferentes, na medida em que são stateful e stateless.

    
por 15.08.2011 / 10:08
fonte
1

Acréscimo à resposta exata do @coder.

A ideia de estado é lembrar dados anteriores .
Por exemplo, você tem um controle de lista no servidor com os valores "A, B, C" e "A" selecionados. A lista vai para o navegador do cliente. Você seleciona "B". E postar de volta para o servidor. Como você sabe que o valor é alterado?

  • ASP.NET
    A Microsoft usa o termo ViewState no ASP.NET. Existe um enorme mal-entendido entre os desenvolvedores sobre isso. O ViewState mantém todo o estado inicial da lista em <input type="hidden" value="base64 encoded" /> : valores "A, B, C" e marca "A está selecionado". Então, com o post de volta, o navegador envia o ViewState e "B é selecionado" para o servidor. O ASP.NET restaura o estado inicial da lista e aplica a nova seleção "B". Isso foi feito para atrair desenvolvedores do WinForms (mencionados por @Ronald). No servidor da Web, você pode se inscrever para listar as alterações listObject.Changed += OnChanged .

  • ASP.NET MVC
    O problema com o ViewState é o tamanho. Durante anos, os desenvolvedores do .NET foram obrigados a transferir kilobytes de informações inúteis, como estados de 20 controles para cada viagem de ida e volta. A nova abordagem é enviar apenas o valor "B" novo e pequeno.
    Ou, se você quiser acompanhar a mudança de "A" para "B", implemente-a por conta própria. Usando javascript e enviando "Was A, Now B". Ou salve e recupere o estado por ID no SQL Server.

  • ASP.NET MVC e ASP.NET implementam o estado para Autenticação e Saque. Portanto, não é correto dizer que a ASP.NET MVC totalmente sem estado.
  • Memória mencionada nas respostas significa "lembrando", não a memória do computador. O estado pode ser implementado armazenando dados no sistema de arquivos, no servidor SQL ou na memória do computador.
por 07.08.2015 / 12:20
fonte
0

Uma operação com estado modifica ou requer algum estado do sistema, e uma operação sem estado não.

O exemplo de uma caixa de texto com estado seria um comentário editado anteriormente no StackExchange - a caixa de texto precisa exibir seu comentário anterior e saber que o tópico em questão foi envolvido para aceitar e processar sua entrada.

Um formulário genérico de comentário por e-mail com uma tag mailto: seria uma caixa de texto sem estado - ele aceita sua entrada e a lança no aplicativo de e-mail da sua estação de trabalho sem reter nenhuma informação.

    
por 27.06.2012 / 16:58
fonte