2009-06-20 8 views
20

Questa mattina ho accidentalmente visto il seguente codice snippet, sono rimasto abbastanza sorpreso perché funziona molto bene.Perché Request.Cookies restituisce una stringa anziché un oggetto HttpCookie nel ciclo foreach?

Non guardare la sua logica per favore, sono solo curioso perché HttpCookieCollection (Request.Cookies in questo caso) restituisce una stringa (nome cookie) invece di un oggetto HttpCookie nel ciclo foreach. È un problema di coerenza perché normalmente otteniamo l'oggetto HttpCookie in questa collezione per indice/nome?

Grazie,

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

Grazie, @ Chris: Non chiedo come iterare una collezione dal ciclo for;) –

+0

Ho lo stesso problema, non capisco perché devo usare string insted di HttpCookie nella dichiarazione foreach. qualche indizio? – gonxalo

+1

se si utilizza System.Net.CookieCollection è possibile iterare in questo modo. ma non con HttpCookieCollection, strano comportamento penso. statico pubblico HttpCookieCollection CookieCollectionToHttpCookieCollection (CookieCollection cookieCollection) { HttpCookieCollection httpCookieCollection = new HttpCookieCollection(); foreach (Cookie in cookieCollection) { httpCookieCollection.Add (CookieToHttpCookie (cookie)); } return httpCookieCollection; } – gonxalo

risposta

6

ha più senso per scorrere un insieme dai tasti. In questo modo si ha accesso a entrambe le chiavi e può facilmente accedere al valore chiamando System.Web.HttpContext.Current.Request.Cookies[cookieKey];

+9

Se non si dispone di due cookie con lo stesso nome, nel qual caso questo approccio è difettoso. –

8

Si consiglia di collegare attraverso i cookie in base all'indice:

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

Dal momento che è possibile ottenere i cookie dal loro indice numerico come beh, in realtà è possibile scansionare più cookie con lo stesso nome senza doverli copiare su CookieCollection o qualcosa del genere.

Questo dovrebbe fare il trucco:

var cookieName = "yourcookie"; 
var matches = cookies.AllKeys 
    .Select((name, i) => new {name, i}) 
    .Where(x => x.name == cookieName) 
    .Select(x => DoSomethingWithEachMatch(cookies[x.i]));