Pourquoi Request.Cookies renvoie-t-il une chaîne au lieu d'un objet HttpCookie dans une boucle foreach?

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

  •  06-07-2019
  •  | 
  •  

Question

Ce matin, j’ai accidentellement vu le code suivant, j’ai été assez surpris car cela fonctionne très bien.

Ne regardez pas sa logique s'il vous plaît, je suis juste curieux de savoir pourquoi HttpCookieCollection (Request.Cookies dans ce cas) renvoie une chaîne (nom du cookie) au lieu d'un objet HttpCookie dans une boucle foreach. Est-ce un problème de cohérence parce que nous obtenons normalement un objet HttpCookie dans cette collection par index / nom?

Merci,

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);
    }
}
Était-ce utile?

La solution

Il est plus logique de parcourir une collection à l’aide des clés. De cette manière, vous avez accès aux deux clés et pouvez facilement accéder à la valeur en appelant System.Web.HttpContext.Current.Request.Cookies [cookieKey];

.

Autres conseils

Vous voudrez peut-être parcourir vos cookies par index:

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);
}

Etant donné que vous pouvez obtenir les cookies par leur index numérique, il est également possible de scanner plusieurs cookies du même nom sans avoir à les copier dans un CookieCollection ou quelque chose comme ça.

Cela devrait faire l'affaire:

var cookieName = "yourcookie";
var matches = cookies.AllKeys
    .Select((name, i) => new {name, i})
    .Where(x => x.name == cookieName)
    .Select(x => DoSomethingWithEachMatch(cookies[x.i]));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top