2009-06-20 3 views
20

Сегодня утром я случайно увидел следующий код фрагмента, я был довольно удивлен, потому что он работает очень хорошо.Почему 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); 
    } 
} 
+0

Спасибо, : Я @ Крис не спросить, как перебирать коллекцию с помощью цикла;) –

+0

У меня такая же проблема, я не понимаю почему я должен использовать string insted HttpCookie в объявлении foreach. любой ключ? – gonxalo

+1

, если вы используете System.Net.CookieCollection, вы можете повторить этот путь. но не с HttpCookieCollection, странное поведение, я думаю. Публичный статический HttpCookieCollection CookieCollectionToHttpCookieCollection (CookieCollection cookieCollection) { HttpCookieCollection httpCookieCollection = new HttpCookieCollection(); foreach (Cookie cookie in cookieCollection) { httpCookieCollection.Add (CookieToHttpCookie (cookie)); } return httpCookieCollection; } – gonxalo

ответ

6

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

+9

Нет, если у вас есть два файла cookie с тем же именем, и в этом случае этот подход является ошибочным. –

8

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

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

Так как вы можете получить печенье по их числовому индексу, как ну, на самом деле, можно сканировать несколько файлов 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])); 
Смежные вопросы