2010-05-27 13 views

Odpowiedz

9

Powodem dzieje się tak dlatego, że typ NameObjectCollectionBaseRequest.Cookies wywodzi wylicza powyżej klawiszy gromadzenia i nie na wartości. Więc kiedy wyliczyć nad kolekcji Request.Cookies otrzymujesz kluczy:

public virtual IEnumerator GetEnumerator() 
{ 
    return new NameObjectKeysEnumerator(this); 
} 

Oznacza to, że dalej będzie działać:

string[] keys = Request.Cookies.Cast<string>().ToArray(); 

Myślę, że można spróbować następujących składników, które mogłyby zostać uznane za brzydkie, ale będzie praca:

List<HttpCookie> lstCookies = Request.Cookies.Keys.Cast<string>() 
    .Select(x => Request.Cookies[x]).ToList(); 

UPDATE:

Jak podkreślił @Jon Benedicto w komentarzach iw his answer stosując właściwość AllKeys jest bardziej optymalny, gdyż oszczędza Obsada:

List<HttpCookie> lstCookies = Request.Cookies.AllKeys 
    .Select(x => Request.Cookies[x]).ToList(); 
+0

Ale wtedy tracisz klawisz -> Połączenie wartość :) – Snake

+0

@Snake, zgadzam się z Tobą, że to nie jest optymalny z punktu widzenia wydajności, ponieważ wielokrotnie wylicza kolekcję, ale jeśli masz kilka elementów, może to nie być dramatyczne. –

+1

Używanie członka AllKeys w HttpCookieCollection zapisuje rzutowanie. Zobacz moją odpowiedź na kod. –

2

.Cookies.Cast<HttpCookie>(); próbuje rzucić odbioru kluczy do kolekcji cookies. To normalne, że dostaniesz błąd :)

To nazwa -> zbieranie wartości, więc rzutowanie na listę nie byłoby dobre.

Chciałbym spróbować przekonwertować go do słownika.

Na przykład:

Od Cookies dziedziczy NameObjectCollectionBase można GetAllKeys() i używać tej listy, aby uzyskać wszystkie wartości i umieścić je w słowniku.

Na przykład

Dictionary cookieCollection = new Dictionary<string, object>(); 

foreach(var key in Request.Cookies.GetAllKeys()) 
{ 
    cookieCollection.Add(key, Request.Cookies.Item[key]); 
} 
5

Jeśli naprawdę chcesz prostą List<HttpCookie> bez kluczykowy> wartości połączenie, a następnie można użyć select w LINQ to zrobić:

var cookies = Request.Cookies.AllKeys.Select(x => Request.Cookies[x]).ToList(); 
+0

IE może wysyłać wiele plików cookie o tej samej nazwie, jeśli pliki cookie są tworzone w oddzielnych domenach. Jeśli tak się stanie, powyższy kod straci jeden z plików cookie. –

0

pytanie może być nieco stary, ale tutaj odpowiedzi nie pokrywają wszystkich przypadków, ponieważ jak podkreślił @CM może istnieć wiele plików cookie o tej samej nazwie.

więc najprostszym sposobem jest pętla kolekcję ciasteczka z pętli for:

var existingCookies = new List<HttpCookie>(); 

for (var i = 0; i < _httpContext.Request.Cookies.Count; i++) 
{ 
    existingCookies.Add(_httpContext.Request.Cookies[i]); 
} 
Powiązane problemy