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

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

  •  06-07-2019
  •  | 
  •  

Вопрос

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

Не смотрите на его логику, пожалуйста, мне просто любопытно, почему 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);
    }
}
Это было полезно?

Решение

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

Другие советы

Возможно, вы захотите просмотреть файлы 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);
}

Поскольку вы также можете получать файлы 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]));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top