lunes, 28 de febrero de 2011

A veces veo “Cookies”

Explicar ahora mismo como funcionan las cookies en ASP.NET me parecería volver a escribir sobre algo que ya está suficientemente explotado en Internet. Sin embargo, trabajando hoy en un proyecto que hace un uso intensivo de las mismas, me he encontrado con un par de situaciones, cuando menos curiosas, que creo si podrían aportar algo nuevo al debate y explicación de cookies en ASP.NET.

En el siguiente enlace se explica casi todos los temas relacionados con cookies en ASP.NET, http://msdn.microsoft.com/es-es/library/ms178194.aspx. Una de los puntos explicar cómo acceder a una cookie en el objeto Request, es decir, saber si hemos recibido del cliente una determinada cookie.

        If Not Request.Cookies.Item("panicoenlaxbox") Is Nothing Then

            ' La cookie existe

        End If


El anterior código no tiene ningún problema y funciona satisfactoriamente, pero cuál es mi sorpresa cuando veo que para preguntar si hemos establecido el valor de una cookie durante el ciclo de vida de nuestra página, el código de comprobación cambia radicalmente. Es decir, un código como el siguiente no funciona como yo pienso cabría esperar:

        If Not Response.Cookies.Item("panicoenlaxbox") Is Nothing Then

            ' Si utilizamos Response, nunca una cookie será Nothing...

            ' Ahora debemos comprobar la propiedad Value de la cookie

        End If

 
Lo que pasa es que si utilizamos Response, la propiedad Item nunca nos devolverá Nothing, luego siempre hay que comprobar, no ya la existencia de la cookie, sino el valor de la cookie.

        If Not String.IsNullOrEmpty(Response.Cookies.Item("panicoenlaxbox").Value) Then

            ' La cookie existe

        End If

 
Ahora que parece que ya hemos solucionado esta dicotomía en la forma de preguntar por la existencia de una cookie, nos encontramos con un comportamiento aún más extraño y que yo, y a menos que alguien me lo explique, no termino de entender. El comportamiento “extraño” consiste en que simplemente por el mero hecho de acceder a la propiedad Item de la colección Response.Cookies, la cookie por la preguntamos es creado automáticamente con el valor “” para su propiedad Value, tanto en la colección Response como en la colección Request. Veamos un ejemplo que no quiero quedar como un mentiroso:

Inicialmente tenemos esta situación en lo relativo a cookies.

clip_image002

Ahora simplemente escribimos el siguiente código:

        If Not String.IsNullOrEmpty(Response.Cookies.Item("panicoenlaxbox").Value) Then

            ' La cookie existe

        End If

 

Y vemos como todo cambia “mágicamente”.

clip_image004

De hecho, esto se traduce en la siguiente cabecera enviada al navegador cliente.

clip_image006

Otro punto interesante en lo relativo al uso de las cookies es que cuando agregamos una cookie, no se comprueba que el nombre sea único en la colección, y de este modo podemos tener 2 cookies con el mismo nombre. Por ejemplo:

        Dim cookie As New HttpCookie("panicoenlaxbox", "primer pánico")

        Response.Cookies.Add(cookie)

        cookie = New HttpCookie("panicoenlaxbox", "segundo pánico")

        Response.Cookies.Add(cookie)

 

clip_image008

Si ahora preguntamos por el valor de la cookie “panicoenlaxbox” el valor devuelto por la colección es siempre el primer elemento de la colección, luego será “primer pánico” en Response y “” en Request.

clip_image010

Y con sus correspondientes 2 cabeceras!!

clip_image012

La conclusión es que mientras que en el código de la página .aspx cuando preguntábamos por “panicoenlaxbox” nos devolvía “primer pánico” (la primera aparición en la colección), en el siguiente PostBack de la página nos devolverá “segundo pánico” puesto que de las 2 cabeceras Set-Cookie ha prevalecido la segunda.

clip_image014

La verdad es que después de todo esto, sólo me queda el consuelo que el método Remove(NombreCookie) elimina todas las cookies con el mismo nombre en la colección, así que si entras en barrena y tienes que borrar cookies al menos puede estar seguro de haber dejado limpia la colección ;-)

Un saludo!

No hay comentarios:

Publicar un comentario