2009-02-21 19 views

Respuesta

39

En una aplicación web, la solicitud es lo que proviene del navegador y la respuesta es lo que el servidor envía de vuelta. Al validar cookies o datos de cookies del navegador, debe usar Request.Cookies. Cuando construya cookies para enviarlas al navegador, deberá agregarlas a Response.Cookies.

95

Son 2 cosas diferentes, una savès [Respuesta], el otro LEE [Petición]

en una cookie (informática hablando) :) se guarda un archivo pequeño para un período de tiempo que contiene un objeto del tipo cadena

en el marco .NET que save a cookie haciendo:

HttpCookie myCookie = new HttpCookie("MyTestCookie"); 
DateTime now = DateTime.Now; 

// Set the cookie value. 
myCookie.Value = now.ToString(); 
// Set the cookie expiration date. 
myCookie.Expires = now.AddMinutes(1); 

// Add the cookie. 
Response.Cookies.Add(myCookie); 

Response.Write("<p> The cookie has been written."); 

Usted escribió una cookie que estará disponible durante un minuto ... normalmente hacemos now.AddMonth (1) para que pueda guardar una cookie durante un mes entero.

Para retrieve a cookie, se utiliza la solicitud (que está solicitando), como:

HttpCookie myCookie = new HttpCookie("MyTestCookie"); 
myCookie = Request.Cookies["MyTestCookie"]; 

// Read the cookie information and display it. 
if (myCookie != null) 
    Response.Write("<p>"+ myCookie.Name + "<p>"+ myCookie.Value); 
else 
    Response.Write("not found"); 

Recuerde:

Para eliminar una cookie, no hay ningún código directa, el truco está en Guarde el mismo nombre de cookie con una fecha de caducidad que ya pasó, por ejemplo, ahora.AddMinutes (-1)

esto eliminará la cookie.

Como puede ver, cada vez que el tiempo de vida de la cookie expira, ese archivo se elimina automáticamente del sistema.

+7

+1 no me di cuenta que tenía que volver a guardar la cookie para actualizar la expiración – Andrew

+2

1 explicación clara y sencilla –

+1

Esto era en su mayoría servicial, pero un poco engañoso ya en su ejemplo, cuando vaya a recuperar la cookie, en realidad sobrescribe la cookie que se guardó previamente con la línea 'HttpCookie myCookie = new HttpCookie (" MyTestCookie ");' En su lugar, use algo como 'HttpCookie myCookie = new HttpCookie (" MyWrittenCookie ") ; ' –

4

Las cookies provienen del navegador en la colección Request.Cookies. Ahí es donde lees las cookies que se enviaron.

Para devolver las cookies al navegador, las coloca en la colección Response.Cookies.

Si desea eliminar una cookie, debe indicarle al navegador que la elimine enviando la cookie con una fecha de vencimiento que haya pasado. El navegador está utilizando la hora local de la computadora cliente, por lo que si está utilizando la hora del servidor para crear una fecha, asegúrese de restar al menos un día para asegurarse de que realmente ha pasado en la hora local del cliente.

16

Al escribir una cookie, use la Respuesta, pero la lectura puede depender de su situación. Normalmente, usted lee de la Solicitud pero si su aplicación está tratando de obtener una cookie que acaba de escribirse o actualizarse y el viaje de ida y vuelta al navegador no se ha realizado, puede necesitar leerlo en Respuesta.

He estado usando este patrón por un tiempo y me funciona bien.

public void WriteCookie(string name, string value) 
{ 
    var cookie = new HttpCookie(name, value); 
    HttpContext.Current.Response.Cookies.Set(cookie); 
} 


public string ReadCookie(string name) 
{ 
    if (HttpContext.Current.Response.Cookies.AllKeys.Contains(name)) 
    { 
     var cookie = HttpContext.Current.Response.Cookies[name]; 
     return cookie.Value; 
    } 

    if (HttpContext.Current.Request.Cookies.AllKeys.Contains(name)) 
    { 
     var cookie = HttpContext.Current.Request.Cookies[name]; 
     return cookie.Value; 
    } 

    return null; 
} 
+4

Un enfoque alternativo pero igual sería simplemente escribir su cookie en las colecciones Response.Cookies AND Request.Cookies al guardar. De esta forma, cualquier lógica adicional en el ciclo puede leer la cookie que acaba de establecer sin mirar en el objeto Response. – Chris

+0

Chris, estuvo de acuerdo y yo solía hacerlo, pero recientemente leí que modificar el objeto Request es un no-no. Intentaremos encontrar una referencia. – andleer

+0

Gracias, Chris. Andrew - Me encantaría ver esa referencia. Por ahora voy con la solución de Chris. – catfood

2

Cuando creo o actualizo una cookie en .NET normalmente lo hago tanto para la colección de cookies de solicitud como de respuesta. De esta forma, puede estar seguro de que si intenta leer la cookie más adelante en la secuencia de solicitud de la página, tendrá la información correcta.

+0

Alex, este problema en particular me ha estado molestando todo el día. Gracias por aclararlo tan simple! – catfood

+0

Sí, hay algunos comportamientos interesantes en los que establecer una cookie en Response también lo establecerá en la solicitud si no existiera. Pero si ya existía en la Solicitud, establecer Respuesta NO actualiza la Solicitud. Parece una característica destinada a ser útil, pero algo inconsistente. Ciertamente, al modificar un múltiplo de cookie varias veces en la misma solicitud, puede encontrarse con errores. – AaronLS

1

El código de Andrew dio un error en el método "AllKeys.Contains". Así que he corregido un poco ..

public void WriteCookie(string strCookieName, string strCookieValue) 
    { 
     var hcCookie = new HttpCookie(strCookieName, strCookieValue); 
     HttpContext.Current.Response.Cookies.Set(hcCookie); 
    } 


    public string ReadCookie(string strCookieName) 
    {  
     foreach (string strCookie in HttpContext.Current.Response.Cookies.AllKeys) 
     { 
      if (strCookie == strCookieName) 
      { 
       return HttpContext.Current.Response.Cookies[strCookie].Value; 
      } 
     }   

     foreach (string strCookie in HttpContext.Current.Request.Cookies.AllKeys) 
     { 
      if (strCookie == strCookieName) 
      { 
       return HttpContext.Current.Request.Cookies[strCookie].Value; 
      } 
     } 

     return null; 
    } 
+0

¿Recordó incluir System.Linq? Al hacerlo, corrigió el error en mi archivo. – chocojosh

+0

Si solo es un pequeño error, sugiera una edición en la publicación original antes de duplicar la respuesta. – Spontifixus

Cuestiones relacionadas