Warum Request.Cookies Rückkehr String statt Http Objekt in foreach-Schleife?
-
06-07-2019 - |
Frage
Heute Morgen habe ich aus Versehen den folgenden Ausschnitt Code sah, war ich ziemlich überrascht, weil es sehr gut funktionieren.
Schauen Sie nicht auf seiner Logik bitte, ich bin nur neugierig, warum die Httpcookiecollection (Request.Cookies in diesem Fall) eine Zeichenfolge (Cookie-Namen) zurückzukehren anstelle einem Http Objekt in foreach-Schleife. Ist es eine Konsistenz Problem, weil wir normalerweise Http Objekt in dieser Sammlung von Index / Namen?
Danke,
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);
}
}
Lösung
Es macht mehr Sinn, durch die Tasten durch eine Sammlung iterieren. Auf diese Weise haben Sie Zugriff auf sowohl den Tasten und den Wert leicht zugänglich machen können durch System.Web.HttpContext.Current.Request.Cookies[cookieKey];
Aufruf
Andere Tipps
Sie können durch den Index durch Ihre Cookies Schleife wollen:
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);
}
Da Sie können durch ihren numerischen Index Cookies bekommen und es ist tatsächlich möglich, mehrere Cookies mit dem gleichen Namen zu scannen, ohne auf einen Cookie oder so etwas kopieren zu müssen.
Das sollte es tun:
var cookieName = "yourcookie";
var matches = cookies.AllKeys
.Select((name, i) => new {name, i})
.Where(x => x.name == cookieName)
.Select(x => DoSomethingWithEachMatch(cookies[x.i]));