Подтвердить что ты не робот

Почему Request.Cookies возвращает строку вместо объекта HttpCookie в цикле foreach?

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

Не смотрите на его логику, мне просто интересно, почему 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);
    }
}
4b9b3361

Ответ 1

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

Ответ 2

Вы можете запрограммировать свои файлы cookie по индексу:

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

Ответ 3

Так как вы можете получать файлы 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]));