¿Cuál es la diferencia entre con estado y sin estado?

82

Los libros y la documentación en el MVC solo se combinan con el uso de los términos de estado y sin estado. Para ser honesto, no puedo captar la idea de lo que hablan los libros. No dan un ejemplo para entender ninguno de los dos estados, en lugar de simplemente decir que HTTP no tiene estado y con ASP.NET MVC Microsoft está de acuerdo. Me estoy perdiendo algo de conocimiento fundamental, ya que no puedo entender qué es un estado y por qué es un estado y lo mismo ocurre con los apátridas.

Un ejemplo simple y breve que habla de un botón de control como un cuadro de texto puede simplificar la comprensión, supongo.

    
pregunta Pankaj Upadhyay 15.08.2011 - 08:34

6 respuestas

38

Sin estado significa que HTTP no tiene soporte integrado para estados; p.ej. no puede almacenar si un usuario ha iniciado sesión o hecho otra cosa.

La solución más común es usar sesiones para superar ese problema. Esto significa que debe poder incluir un identificador de sesión en cada respuesta o solicitud. Esto se realiza creando una cookie de sesión o incluyendo el identificador de sesión en todos los enlaces.

WebForms intenta hacer todo eso transparente (usando ViewState) mientras MVC te obliga a manejarlo manualmente.

En tu ejemplo mencionaste Botones y cuadros de texto. La forma más sencilla de permitirles mantener su estado es simplemente dejar de publicar toda la página. MVC obtuvo un excelente soporte para ajax (a través de jQuery) y te sugiero que uses ajax si solo quieres hacer algo en la página actual.

    
respondido por el jgauffin 15.08.2011 - 08:38
105

Sin estado: no hay memoria (estado) que mantiene el programa

Estado - El programa tiene una memoria (estado)

Para ilustrar el concepto de estado, definiré una función que es con estado y otra que es sin estado

Sin estado

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

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

con estado

//The state is maintained by the function

private int _number = 0; //initially zero 

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

Como han dicho otros, http es inherentemente sin estado. Así que el estado debe estar integrado en sus aplicaciones.

Imagine una solicitud a través de la web en la que tiene un navegador cliente que se comunica con un proceso del servidor. Para mantener el estado sobre el protocolo http sin estado que el navegador enviará, normalmente se enviará un identificador de sesión al servidor en cada solicitud. Para cada solicitud, el servidor será como "ah, es este tipo". La información del estado se puede buscar en la memoria del lado del servidor o en una base de datos basada en este ID de sesión.

En un entorno sin estado, no necesitarías este ID de sesión. Cada solicitud contendría toda la información que el servidor necesitaría procesar. Sin embargo, muchas aplicaciones deben mantener el estado para realizar un seguimiento de si una sesión se autentica o no para ver cierto contenido o para realizar un seguimiento de lo que está haciendo un usuario. No querría enviar credenciales de usuario por el cable para cada solicitud.

    
respondido por el coder 27.06.2012 - 19:08
67

sin estado significa que no hay memoria del pasado. Cada transacción se realiza como si se hiciera por primera vez.

statefull significa que hay memoria del pasado. Las transacciones anteriores se recuerdan y pueden afectar la transacción actual.

    
respondido por el CWallach 27.06.2012 - 20:32
3

En mi opinión, la diferencia entre ASP.NET (con estado) y ASP.NET-MVC (sin estado) puede aislarse al hecho de que el primero proporciona controles del lado del servidor y el otro no.

Vale la pena señalar que el enfoque de formularios web de ASP.NET está orientado a la transición de los antiguos programadores VB y VC ++ que se utilizan en el modelo basado en el modelo de eventos para tener una buena forma rápida de aprender programación web siguiendo el mismo paradigma de modelo de evento. ¡Al igual que haces clic en un botón y listo desencadenas un evento! Todo lo que necesita hacer ahora es escribir su código en el controlador de eventos. Debido a eso, ASP.NET necesitaba tener conceptos como el estado de vista y las devoluciones de datos para monitorear el estado de los controles del lado del servidor en cada viaje de ida y vuelta.

ASP.NET-MVC, sin embargo, no utiliza controles del lado del servidor, por lo que no tiene que mantener el estado. El modelo MVC separa el dominio del problema en las tres particiones para que los datos se entreguen al cliente de manera simplificada.

En resumen, los controles del lado del servidor son los que los hacen diferentes en cuanto a ser estadísticos y sin estado.

    
respondido por el Ronald 15.08.2011 - 10:08
1

Adición a @coder respuesta exacta.

La idea de estado es recordar datos anteriores .
Por ejemplo, tiene un control de lista en el servidor con los valores "A, B, C" y "A" está seleccionado. La lista va al navegador del cliente. Selecciona "B". Y publicar de nuevo en el servidor. ¿Cómo sabes que se cambia el valor?

  • ASP.NET
    Microsoft usa el término ViewState en ASP.NET. Hay un gran malentendido entre los desarrolladores al respecto.
    ViewState mantiene todos los estados iniciales de la lista en <input type="hidden" value="base64 encoded" /> : valores "A, B, C" y la marca "A está seleccionada".
    Luego, con el navegador posterior, el navegador envía ViewState y se selecciona "B" en el servidor. ASP.NET restaura el estado inicial de la lista y aplica la nueva selección "B". Esto se hizo para atraer a los desarrolladores de WinForms (mencionados por @Ronald). En el servidor web puede suscribirse a la lista de cambios listObject.Changed += OnChanged .

  • ASP.NET MVC
    El problema con ViewState es el tamaño. Durante años, los desarrolladores de .NET se vieron obligados a transferir kilobytes de información inútil, como estados de 20 controles para cada viaje de ida y vuelta.
    El nuevo enfoque es enviar solo el valor "B" nuevo y pequeño.
    O si desea realizar un seguimiento del cambio de "A" a "B", implementarlo por su cuenta. Usando javascript y enviando "Was A, Now B". O guardar y recuperar el estado por ID en SQL Server.

  • MVC de ASP.NET y ASP.NET implementan el estado de autenticación y cobro. Por lo tanto, no es correcto decir que ASP.NET MVC es completamente sin estado.
  • Memoria mencionada en las respuestas significa "recordar", no la memoria de la computadora. El estado se puede implementar almacenando los datos en el sistema de archivos, el servidor SQL o la memoria de la computadora.
respondido por el Artru 07.08.2015 - 12:20
0

Una operación con estado modifica o requiere algún estado del sistema, y una operación sin estado no lo hace.

El ejemplo de un cuadro de texto con estado sería un comentario editado previamente en StackExchange: el cuadro de texto debe mostrar su comentario anterior y conocer el subproceso en el que participó para aceptar y procesar su entrada.

Un formulario de comentario de correo electrónico genérico con una etiqueta mailto: sería un cuadro de texto sin estado: acepta su entrada y la envía a la aplicación de correo de su estación de trabajo sin retener ninguna información.

    
respondido por el lonstar 27.06.2012 - 16:58

Lea otras preguntas en las etiquetas