Por que Request.Cookies retornar cadeia em vez HttpCookie de objeto no loop foreach?

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

  •  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);
    }
}
Foi útil?

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]));
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top