2010-06-10 37 views
14

que he visto este consejo ...¿Cómo puedo hacer que mi aplicación web sea sin estado y aún así hacer algo útil?

idealmente la web debe seguir el principio descansar y estar completamente sin estado. Por lo tanto, una sola URL debe identificar un solo recurso, sin tener que mantener el historial de navegación de cada usuario.

... y leí la página de Wikipedia http://en.wikipedia.org/wiki/REST y realmente suena bien, pero no entiendo cómo implementarlo realmente. Estoy trabajando en ASP .NET Webforms NOT MVC.

Por ejemplo, en la aplicación que estoy por construir, necesito que mi usuario inicie sesión antes de permitirles hacer algo. Hay un par de aros que deben pasar antes de que se les permita hacer muchas cosas útiles, como Aceptar T y C, y confirmar que sus detalles básicos no se hayan modificado. ¡Finalmente se les permite hacer algo que realmente quieren como BuyAProduct!

Me parece (vengo del mundo HEAVILY stateful del cliente Rich) que necesito estado para registrar lo que han hecho e inferir de eso lo que están autorizados a hacer. No veo cómo puedo apoyarlos (por ejemplo) marcando el URI de BuyAProduct. Cuando llegan al marcador, ¿cómo sé si se han registrado y si han aceptado las T y C y si han verificado diligentemente sus detalles básicos?

Me encanta la idea de que la aplicación sea apátrida, en parte porque parece resolver por completo el problema de "¿Qué diablos hago cuando el usuario hace clic en los botones Atrás y Adelante?" No veo cómo puedo lograr que funcione correctamente. Siento que me estoy perdiendo algo realmente fundamental sobre esto.

+1

¿Por qué? Si está funcionando, ¿por qué cambiar? Las aplicaciones web tienden a necesitar ser con estado, por lo tanto, sesiones y cookies. –

+0

Ah, no funciona, ya que aún no está construido. Estoy pensando en las opciones de diseño. Editaré la pregunta. – RichardHowells

+3

@John Puedo asegurar que las aplicaciones web no necesitan usar sesiones y cookies. –

Respuesta

23

El consejo no está sugiriendo que la aplicación sea apátrida, lo que sugiere que los recursos en la aplicación deberían ser apátridas. Es decir, una página llamada "www.misitio.es/resources/123" siempre representará el mismo recurso, independientemente de qué usuario esté accediendo a él o si está conectado o no.

(El hecho de que es posible denegar el acceso de no usuario conectado es un tema aparte - el punto es que el propio Uri no se basa en datos específicos del usuario para trabajar.)

Por ejemplo , el tipo de sitios que violan esta regla son aquellos en los que navega a una página de producto, envíele un correo electrónico a Uri a su amigo, y al hacer clic en él, verá un mensaje en la línea de "Lo siento, su sesión ha expirado" o "Este producto no existe" o similar. La razón por la que esto sucede es porque el URI incluye algo específico para la sesión del usuario en el sitio, y si un usuario diferente intenta usar el enlace (o el mismo usuario en otro momento), ya no es válido.

Por lo tanto, siempre necesitará algún tipo de estado para su aplicación, pero donde se implementa ese estado es el factor importante.

Espero que ayude a arrojar un poco de luz!

+0

Sería útil tener en cuenta que, en algunos casos, los recursos son específicos del usuario, por lo que solo los usuarios autorizados verían ciertos recursos y otros no. Por lo tanto, las interacciones específicas del usuario están disponibles. –

+0

Sí, pero el URI de ese recurso debe permanecer igual para todos los usuarios, tengan o no acceso. (Si se tratara de una aplicación REST, por ejemplo, haría que el Uri devuelva un estado Http Not Authorized donde sea relevante, en lugar del recurso). –

+0

Entonces, ¿el estado debe mantenerse en el cliente? Diga, tengo un enlace de Una persona www.XXXX.com/persom/Tom, y este sitio web le negará acceso a un extraño, si soy su amigo, copio este enlace, y veré su publicación, mientras que si Soy un extraño, será prohibido. Puedo considerar esta relación como un estado, ya que de hecho el mismo URI nos da la página diferente. Debe tener algo que mantener en el servidor, por ejemplo, en la base de datos para mantener la relación. Si se trata de un tipo de estado, ¿esta aplicación es apátrida? – Jaskey

12

Si quieres hacer formularios web, es genial. Si quieres hacer REST eso también es genial. Pero, por favor, por el amor a todo lo sagrado, no intente adherirse a los principios de REST utilizando formularios web.

Para aclarar más este punto, no creo que los formularios web sean una buena elección para REST porque el modelo conceptual en el que se basa WebForms es uno en el que abstrae la Web. Fue construido para emular el modelo de desarrollo de VB.

REST abarca HTTP y la naturaleza distribuida de las aplicaciones web. Los dos enfoques no son compatibles.

+3

+1 esto es como petróleo y agua –

+0

No, creo que estás equivocado, ya que el principio básico del que habla también se puede aplicar (y * debería) a WebForms: no pongas información de estado en tu Uri. –

+0

@Dan Creo que lo que quiso decir es que no ponga una referencia al estado de la sesión del servidor en la url. Poner el estado de la aplicación cliente en la URL es un enfoque completamente tranquilo. Independientemente de si el estado de la sesión está en la URL o se comunica de alguna otra manera, como una cookie, el estado de la sesión conduce a una violación de la restricción autodescriptiva REST. –

1

Aquí está la cosa: REST se trata de comunicaciones con estado a través de un protocolo sin estado. No es que REST sea apátrida. WebForms le permite retener el estado entre las solicitudes. ¿Por qué es eso necesario? Te permite hacer cosas como ordenar elementos en una lista con los botones arriba/abajo sin tener que actualizar el recurso subyacente con cada clic. No necesitas eso. Simplemente, PONGA la representación de recursos para que se vea correcta o use JavaScript para editar su representación y luego realice una PUT al final una vez que esté satisfecho. (Tenga en cuenta que he usado palabras, se debe publicar. Lo que realmente está haciendo es sustituir la representación por lo que el futuro GET recuperar el estado de derecho .)

Web Forms utiliza el poste para todo. Solo debe enviar a una URL cuando está creando un nuevo elemento y no sabe dónde vivirá. Si conoce su url, entonces debe usar PUT para crear o reemplazar. Si necesita pasos intermedios para, por ejemplo, un carrito de compras, debe crear representaciones de recursos para esos pasos intermedios. Su navegador y servidor se comunican al pasar representaciones completas entre ellos. Es un simple mensaje de respuesta/solicitud que pasa.

WebForms no recomienda esto. Usted puede construir sistemas RESTful en WebForms, pero el modelo predeterminado lo alejará de él hacia un enfoque RPC. Puedo pensar en dos formas: Front Controller (en cuyo caso deberías considerar MVC) o usar archivos .ashx para casi todo. El modelo de Postback borra bastante bien cualquier esperanza real de realizar un REST verdadero con WebForms/.aspx reales (es decir, PUT y DELETE siempre son POST y, por lo tanto, fallan el modelo REST).

+0

Según RFC2616 POST se puede usar para enviar una entidad a un recurso de procesamiento. Esto no implica la creación de un recurso. Crear es solo uno de los usos de POST. No es necesario usar PUT y DELETE para que sea RESTful. Consulte estas preguntas frecuentes https://code.google.com/p/implementing-rest/wiki/FAQ –

+0

@Darrel Fair enough. Probablemente me inclino demasiado para ser explícito. El problema que veo es que hace que sea muy fácil explicar todo, lo que nos lleva de vuelta a RPC. –

+0

@Darrel Lo que me interesa es el Nivel 3 del Richardson Maturity Model: http://code.google.com/p/implementing-rest/wiki/RMM.Bueno, tal vez el nivel 2. :) –

1

Una cookie parece ser la respuesta a su pregunta. Puede usar el proveedor de autenticación .net que configurará una cookie, que su aplicación puede verificar y solicitar su presencia si desean comprar algo.

Lo que desea evitar es mantener una representación del estado de ellos en el servidor, también conocido como cookie de sesión. Eso hará que escalar sea más difícil.

1

Está bien mantener el estado de los recursos. La "prohibición sin estado" solo se refiere al estado de la sesión.

He aquí un extracto de Roy Fielding's seminal REST derivation:

A continuación añadimos una restricción a la interacción cliente-servidor: comunicación debe ser sin estado en la naturaleza, como en el estilo cliente sin estado-servidor (CSS) de Sección 3.4.3 (Figura 5-3), , de modo que cada solicitud del cliente al servidor debe contener toda la información necesaria para comprender la solicitud, y no puede aprovechar ventaja de cualquier contexto almacenado en el servidor. El estado de la sesión es por lo tanto, se mantiene completamente en el cliente.

+0

¿Cómo es esto posible cuando el cliente (navegador web) no puede almacenar ninguna información segura (también conocido como credenciales)? – BeniRose

Cuestiones relacionadas