Qual é a diferença entre sem estado e sem estado?

86

Os livros e a documentação no MVC apenas se valem do uso dos termos Stateful e Stateless. Para ser sincero, sou incapaz de entender a idéia, do que os livros estão falando. Eles não dão um exemplo para entender nenhum dos dois estados, em vez de apenas dizer que o HTTP é sem estado e com o ASP.NET MVC a microsoft o acompanha. Estou perdendo algum conhecimento fundamental, pois não consigo entender o que é stateful e por que é stateful e o mesmo vale para apátridas.

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

Pankaj Upadhyay
fonte

Respostas:

40

Sem estado significa que o HTTP não possui suporte embutido para estados; por exemplo, você não pode armazenar se um usuário efetuou login ou fez outra coisa.

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

O WebForms tenta tornar tudo isso transparente (usando o ViewState) enquanto o MVC obriga a lidar com isso manualmente.

No seu exemplo, você mencionou botões e caixas de texto. A maneira mais fácil de deixá-los manter seu estado é simplesmente parar de postar de volta a página inteira. O MVC obteve excelente suporte ao ajax (por meio do jQuery) e sugiro que você use o ajax se quiser fazer algo na página atual.

jgauffin
fonte
3
isso significa que, se eu estiver logado em um site, todas as páginas visitadas serão checadas novamente para autenticação antes de renderizar o conteúdo via identificador de sessão ou um cookie de sessão?
Pankaj Upadhyay
3
sim esta correto.
jgauffin
então o apátrida é melhor ou pior?
Lucas - Better Coding Academy
1
@ think123: É mais eficiente porque você não precisa gerenciar o estado (por exemplo, balanceamento de carga etc. é muito mais fácil). É cada vez mais complexo, pois você precisa gerenciar um estado artificial.
jgauffin
5
@jgauffin: Desempenho é a palavra errada aqui. O estado sem estado é menos eficiente, pois você não tem a oportunidade de armazenar em cache o estado e precisa procurar repetidamente. O que é é mais escalável ; é aí que entra o balanceamento de carga e os ganhos de escalabilidade podem compensar as perdas no desempenho quando o sistema fica grande o suficiente.
Mason Wheeler
108

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 monitoração de estado e outra sem estado

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

Como outros já disseram, o http é inerentemente sem estado. Portanto, o estado deve ser incorporado aos seus aplicativos.

Imagine uma solicitação pela Web em que você tenha um navegador cliente se comunicando com um processo do servidor. Para manter o estado sobre o protocolo http sem estado, o navegador envia normalmente um identificador de sessão ao servidor em cada solicitação. Para cada solicitação, o servidor será "ah, é esse cara". As informações de estado podem ser pesquisadas na memória do servidor ou em um banco de dados com base nessa identificação 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 controlar se uma sessão está 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 por fio para cada solicitação.

codificador
fonte
pergunta rápida: portanto, se o ID da sessão for usado (ou seja, roubado) por outro usuário, o servidor não tem idéia de que é outra pessoa?
Mihai
4
Está correto. Existem maneiras de proteger a identidade de um usuário, como o uso de cookies https ou{ponly. Mas se o computador de um usuário estiver comprometido, um invasor poderá enganar o servidor e pensar que ele é o usuário.
Codificador
2
+1 para um exemplo de código claro e preciso. Estou cada vez mais convencido de que os termos de TI mais complexos só podem ser entendidos no contexto.
Sebastian
A possibilidade de um ID de sessão ser roubado é um dos motivos pelos quais você deve ter cuidado e aplicativos como um CMS ou algo como o OAuth criam maneiras de tornar isso muito mais difícil.
Elin
4
Para cada solicitação, o servidor será do tipo "ah, é esse cara" - é melhor dizer que em todos os outros exemplos que eu vi
Rafael Eyng
69

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

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

CWallach
fonte
9
Isso deveria ter recebido a resposta. É de longe a resposta mais clara e precisa aqui.
MAWG
3
Simples e preciso.
Ivan Ivković
2
É preciso para quem já conhece a diferença.
Rafael Eyng 25/05
3

Na minha opinião simples, a diferença entre ASP.NET (com estado) e ASP.NET-MVC (sem estado) pode ser isolada pelo fato de o primeiro fornecer controles do lado do servidor e o outro não.

Vale ressaltar que a abordagem de formulários da Web do ASP.NET é voltada para a transição de programadores antigos de VB e VC ++ que são usados ​​no modelo orientado ao modelo de evento para ter uma boa maneira rápida de aprender programação da Web seguindo o mesmo paradigma de modelo de evento, como você clica em um botão e pronto você aciona um evento! Tudo que você precisa fazer agora é escrever seu código no manipulador de eventos. Por isso, o ASP.NET precisava ter conceitos como exibir estado e postbacks para monitorar o estado dos controles do lado do servidor a cada 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 estatais e sem estado.

Ronald
fonte
1

Adição à resposta exata do @coder.

A idéia 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 poste de volta no servidor. Como você saberia que o valor foi alterado?

  • ASP.NET A
    Microsoft usa o termo ViewState no ASP.NET. Há 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".
    Em seguida, o navegador de postagem envia o ViewState e "B está 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 os 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 .NET foram forçados a transferir kilobytes de informações inúteis, como estados de 20 controles para cada ida e volta.
    A nova abordagem é enviar apenas novos e pequenos valores "B".
    Ou, se você deseja acompanhar a alteração de "A" para "B", implemente-a por conta própria. Usando javascript e enviando "Era A, Agora B". Ou salve e recupere o estado por ID no SQL Server.

  • O ASP.NET MVC e o ASP.NET implementam o estado para autenticação e desconto. Portanto, não é correto dizer que o ASP.NET MVC é totalmente sem estado.
  • Memória mencionada nas respostas significa "lembrar", não memória do computador. O estado pode ser implementado armazenando dados no sistema de arquivos, no servidor SQL ou na memória do computador.
Artru
fonte
seja construtivo e explicar de erro antes de colocar menos
Artru
0

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

Um 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 conhecer o segmento posterior ao qual ele estava envolvido para aceitar e processar sua entrada.

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

lonstar
fonte
Um formulário típico "deixe seu endereço de e-mail e uma mensagem e entraremos em contato com você" também não tem estado. Quando você envia o formulário, o servidor não se importa de onde o obteve e apenas copia os dados em alguma lista de tarefas do serviço ao cliente e esquece.
StarWeaver