Perché Request.Cookies restituisce stringa anziché oggetto HttpCookie nel ciclo foreach?

StackOverflow https://stackoverflow.com/questions/1021183

  •  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);
    }
}
È stato utile?

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]));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top