¿Por qué Request.Cookies devuelve una cadena en lugar del objeto HttpCookie en el bucle foreach?

StackOverflow https://stackoverflow.com/questions/1021183

  •  06-07-2019
  •  | 
  •  

Pregunta

Esta mañana vi accidentalmente el siguiente código de fragmento, me sorprendió bastante porque funciona muy bien.

No mire su lógica, por favor, solo tengo curiosidad por saber por qué HttpCookieCollection (Request.Cookies en este caso) devuelve una cadena (nombre de cookie) en lugar de un objeto HttpCookie en el bucle foreach. ¿Es un problema de coherencia porque normalmente obtenemos el objeto HttpCookie en esta colección por índice / nombre?

Gracias,

foreach (string cookieKey in System.Web.HttpContext.Current.Request.Cookies)
{
    HttpCookie tmpCookie = System.Web.HttpContext.Current.Request.Cookies[cookieKey];
    if (tmpCookie != null && tmpCookie["RecentlyVisited"] != null)
    {
       cookie.Add(tmpCookie);
    }
}
¿Fue útil?

Solución

Tiene más sentido iterar a través de una colección por las teclas. De esa manera, tiene acceso a ambas claves y puede acceder fácilmente al valor llamando a System.Web.HttpContext.Current.Request.Cookies[cookieKeyfont>;

Otros consejos

Es posible que desee recorrer sus cookies por índice:

HttpCookieCollection MyCookieColl;
HttpCookie MyCookie;

MyCookieColl = Request.Cookies;

// Capture all cookie names into a string array.
String[] arr1 = MyCookieColl.AllKeys;

// Grab individual cookie objects by cookie name.
for (int i = 0; i < arr1.Length; i++) 
{
   MyCookie = MyCookieColl[arr1[i]];
   Debug.WriteLine("Cookie: " + MyCookie.Name);
   Debug.WriteLine("Expires: " + MyCookie.Expires);
   Debug.WriteLine("Secure:" + MyCookie.Secure);
}

Dado que también puede obtener cookies por su índice numérico, en realidad es posible escanear múltiples cookies con el mismo nombre sin tener que copiarlas en una CookieCollection o algo así.

Esto debería hacer el truco:

var cookieName = "yourcookie";
var matches = cookies.AllKeys
    .Select((name, i) => new {name, i})
    .Where(x => x.name == cookieName)
    .Select(x => DoSomethingWithEachMatch(cookies[x.i]));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top