2009-06-20 8 views
20

Dziś rano przypadkowo zobaczyłem poniższy kod fragmentu, byłem dość zaskoczony, ponieważ działa bardzo dobrze.Dlaczego Request.Cookies zwraca ciąg znaków zamiast obiektu HttpCookie w pętli foreach?

Nie patrz na jego logikę proszę, jestem tylko ciekawy dlaczego HttpCookieCollection (Request.Cookies w tym przypadku) zwraca ciąg (nazwa cookie) zamiast obiektu HttpCookie w pętli foreach. Czy jest to kwestia spójności, ponieważ zwykle otrzymujemy obiekt HttpCookie w tej kolekcji według indeksu/nazwy?

Dzięki,

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

Dziękuję @Chris: Nie pytam jak iteracyjne kolekcji przy pętli;) –

+0

mam ten sam problem, ja nie rozumiem dlaczego muszę użyć ciągu insted z HttpCookie w deklaracji foreach. jakaś wskazówka? – gonxalo

+1

jeśli używasz System.Net.CookieCollection możesz iterować w ten sposób. ale nie z HttpCookieCollection, dziwne zachowanie myślę. static HttpCookieCollection CookieCollectionToHttpCookieCollection (CookieCollection cookieCollection) { HttpCookieCollection httpCookieCollection = nowy HttpCookieCollection(); foreach (plik cookie cookie w cookieCollection) { httpCookieCollection.Add (CookieToHttpCookie (cookie)); } return httpCookieCollection; } – gonxalo

Odpowiedz

6

większy sens do iterację kolekcji kluczy. W ten sposób masz dostęp do obu klawiszy i można łatwo uzyskać dostęp do wartości poprzez wywołanie System.Web.HttpContext.Current.Request.Cookies[cookieKey];

+9

Nie, jeśli masz dwa pliki cookie o tej samej nazwie, w którym to przypadku takie podejście jest wadliwe. –

8

Możesz pętli plików cookie przez index:

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

Ponieważ można dostać ciasteczka ich indeksem liczbowym jako Cóż, możliwe jest skanowanie wielu plików cookie o tej samej nazwie bez konieczności kopiowania do CookieCollection lub czegoś podobnego.

To powinno załatwić sprawę:

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