Perché Request.Cookies restituisce stringa anziché oggetto HttpCookie nel ciclo foreach?
-
06-07-2019 - |
Domanda
Questa mattina ho visto accidentalmente il seguente codice del frammento, sono rimasto abbastanza sorpreso perché funziona molto bene.
Non guardare la sua logica per favore, sono solo curioso di sapere 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 raccolta 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);
}
}
Soluzione
Ha più senso scorrere le chiavi in ??una raccolta. In questo modo hai accesso a entrambe le chiavi e puoi accedere facilmente al valore chiamando System.Web.HttpContext.Current.Request.Cookies[cookieKey[;
Altri suggerimenti
Potresti voler scorrere i tuoi cookie per 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);
}
Dal momento che puoi ottenere i cookie anche tramite il loro indice numerico, 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]));