2010-05-27 9 views

Antwort

9

Der Grund, warum dies passiert ist, weil die NameObjectCollectionBase Art, dass Request.Cookies von aufzählt über die Tasten der Sammlung ableitet und nicht über die Werte. Also, wenn Sie die Request.Cookies Sammlung aufzählen über die Schlüssel bekommen:

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

Dies bedeutet, dass die folgende funktioniert:

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

Ich denke, man könnte die folgende versuchen, die hässlich angesehen werden könnten, sondern wird Arbeit:

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

UPDATE:

Wie bereits in den Kommentaren von @ Jon Benedicto und in his answer mit der AllKeys Eigenschaft mehr optimal ist, da es eine Besetzung rettet:

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

Aber dann verlieren Sie den Schlüssel -> Wert Verbindung :) – Snake

+0

@Snake, Ich stimme Ihnen zu, dass dies nicht optimal vom Standpunkt der Leistung aus, da es die Sammlung mehrmals aufzählt, aber wenn Sie ein paar Elemente haben, ist es vielleicht nicht dramatisch. –

+1

Mit dem AllKeys-Mitglied von HttpCookieCollection wird eine Besetzung gespeichert. Siehe meine Antwort für den Code. –

2

.Cookies.Cast<HttpCookie>(); versucht, die Sammlung von Schlüsseln zu einer Sammlung von Cookies zu werfen. So ist es normal, dass Sie einen Fehler bekommen :)

Es ist ein Name -> Wert Sammlung, so Casting zu einer Liste wäre nicht gut.

Ich würde versuchen, es in ein Wörterbuch zu konvertieren.

Zum Beispiel:

Da Cookies von Nameobjectcollectionbase erbt können Sie GetAllKeys(), und diese Liste verwenden, um alle Werte zu erhalten und sie in einem Wörterbuch setzen.

Zum Beispiel:

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

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

Wenn Sie wirklich eine gerade List<HttpCookie> ohne Key-> Wert wollen Verbindung, dann können Sie wählen in LINQ verwenden, es zu tun:

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

IE kann mehrere Cookies mit demselben Namen senden, wenn die Cookies in separaten Domänen erstellt werden. Wenn dies geschieht, verliert der obige Code eines der Cookies. –

0

Die Frage kann ein bisschen alt, aber die Antworten hier sind nicht alle Fälle abdecken, denn wie durch @CM wies darauf hin, Es kann mehrere Cookies mit demselben Namen geben.

So ist der einfachste Weg, um Schleife ist die Cookies-Sammlung mit einer for-Schleife:

var existingCookies = new List<HttpCookie>(); 

for (var i = 0; i < _httpContext.Request.Cookies.Count; i++) 
{ 
    existingCookies.Add(_httpContext.Request.Cookies[i]); 
} 
Verwandte Themen