2009-06-20 23 views
20

Esta mañana vi accidentalmente el siguiente código de fragmento, estaba bastante sorprendido porque funciona muy bien.¿Por qué Request.Cookies devuelve una cadena en lugar de un objeto HttpCookie en el bucle foreach?

No mire su lógica por favor, solo tengo curiosidad por qué la 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); 
    } 
} 
+0

Gracias, @ Chris: Yo no te pido la forma de repetición por una colección de bucle;) –

+0

tengo el mismo problema, que no entiendo ¿Por qué tengo que usar una cadena inscrita de HttpCookie en la declaración foreach? ¿Cualquier pista? – gonxalo

+1

si usa System.Net.CookieCollection puede iterar de esa manera. pero no con HttpCookieCollection, extraño comportamiento, creo. public static HttpCookieCollection CookieCollectionToHttpCookieCollection (CookieCollection cookieCollection) { HttpCookieCollection httpCookieCollection = new HttpCookieCollection(); foreach (Cookie cookie en cookieCollection) { httpCookieCollection.Add (CookieToHttpCookie (cookie)); } return httpCookieCollection; } – gonxalo

Respuesta

6

tiene más sentido para iterar a través de una colección de las llaves. De esta manera se tiene acceso a las claves y puede tener acceso fácilmente el valor llamando System.Web.HttpContext.Current.Request.Cookies[cookieKey];

+9

No si tiene dos cookies con el mismo nombre, en cuyo caso este enfoque es defectuoso. –

8

Es posible que desee colocar a través de las cookies por el í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); 
} 
4

Ya que se puede obtener galletas por su índice numérico como bueno, en realidad es posible escanear múltiples cookies con el mismo nombre sin tener que copiar a un 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])); 
Cuestiones relacionadas