Почему Request.Cookies возвращает строку вместо объекта HttpCookie в цикле foreach? - PullRequest
21 голосов
/ 20 июня 2009

Этим утром я случайно увидел следующий фрагмент кода, я был довольно удивлен, потому что он работает очень хорошо.

Не смотрите на его логику, пожалуйста, мне просто любопытно, почему HttpCookieCollection (в данном случае Request.Cookies) возвращает строку (имя cookie) вместо объекта HttpCookie в цикле foreach. Это проблема согласованности, потому что мы обычно получаем объект HttpCookie в этой коллекции по индексу / имени?

Спасибо

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

Ответы [ 3 ]

8 голосов
/ 20 июня 2009

Вы можете просмотреть свои куки по индексу:

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);
}
6 голосов
/ 20 июня 2009

Имеет смысл перебирать коллекцию по ключам. Таким образом, вы получаете доступ к обоим ключам и можете легко получить доступ к значению, набрав System.Web.HttpContext.Current.Request.Cookies[cookieKey];

4 голосов
/ 13 ноября 2013

Поскольку вы можете получать cookie-файлы по их числовому индексу, фактически можно сканировать несколько cookie-файлов с одним и тем же именем без необходимости копировать их в CookieCollection или что-то в этом роде.

Это должно сработать:

var cookieName = "yourcookie";
var matches = cookies.AllKeys
    .Select((name, i) => new {name, i})
    .Where(x => x.name == cookieName)
    .Select(x => DoSomethingWithEachMatch(cookies[x.i]));
...