Por que Request.Cookies retornar cadeia em vez HttpCookie de objeto no loop foreach?
-
06-07-2019 - |
Pergunta
Esta manhã eu acidentalmente viu o seguinte trecho de código, eu estava bastante surpreendido porque ele funciona muito bem.
Não olhe para a sua lógica por favor, eu sou apenas um curioso por que os HttpCookieCollection (Request.Cookies neste caso) retornar uma string (nome do cookie) em vez de um objeto HttpCookie em loop foreach. É uma questão de consistência, porque nós normalmente obter HttpCookie objecto nesta colecção pelo índice / nome?
Obrigado,
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);
}
}
Solução
Faz mais sentido para percorrer uma coleção de chaves. Dessa forma, você tem acesso a ambas as chaves e pode facilmente acessar o valor chamando System.Web.HttpContext.Current.Request.Cookies[cookieKey];
Outras dicas
Você pode querer percorrer os cookies por índice:
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);
}
Uma vez que você pode obter os cookies pelo seu índice numérico, bem na verdade é possível digitalizar vários cookies com o mesmo nome sem ter que copiar para um CookieCollection ou algo parecido.
Isso deve fazer o truque:
var cookieName = "yourcookie";
var matches = cookies.AllKeys
.Select((name, i) => new {name, i})
.Where(x => x.name == cookieName)
.Select(x => DoSomethingWithEachMatch(cookies[x.i]));