2010-05-27 53 views
7

任何人都知道我可以转换Request.CookiesList<HttpCookie>?以下内容不起作用,因为它引发异常。如何将Cookies集合转换为通用列表?轻松

List<HttpCookie> lstCookies = new List<HttpCookie>(
    Request.Cookies.Cast<HttpCookie>()); 

例外:无法转换类型“System.String”的对象为类型“System.Web.HttpCookie”

回答

9

之所以出现这种情况是因为NameObjectCollectionBase类型Request.Cookies来自收集的钥匙,而不是在枚举值派生。所以,当你列举在Request.Cookies收集你所得到的键:

public virtual IEnumerator GetEnumerator() 
{ 
    return new NameObjectKeysEnumerator(this); 
} 

这意味着,下面的工作:

string[] keys = Request.Cookies.Cast<string>().ToArray(); 

我想你可以尝试都可能被视为丑陋,但会以下工作:

List<HttpCookie> lstCookies = Request.Cookies.Keys.Cast<string>() 
    .Select(x => Request.Cookies[x]).ToList(); 

UPDATE:

正如指出的@乔恩贝内迪克托在评论部分和his answer使用AllKeys属性是更理想的,因为它节省了转换:

List<HttpCookie> lstCookies = Request.Cookies.AllKeys 
    .Select(x => Request.Cookies[x]).ToList(); 
+0

但随后丢失了密钥 - >值连接:) – Snake 2010-05-27 16:26:31

+0

@Snake,我同意你的看法,这是不是最佳从性能的角度来看,它会多次枚举集合,但如果你有几个元素,它可能不是很有戏剧性。 – 2010-05-27 16:28:02

+1

使用HttpCookieCollection的AllKeys成员保存一个强制转换。查看我的代码答案。 – 2010-05-27 16:32:40

2

.Cookies.Cast<HttpCookie>();尝试密钥集合投射到饼干的集合。所以,你得到一个错误:)

它的名字是正常的 - >收藏价值,所以铸造到一个列表不会是好的。

我会尝试将其转换为一个字典。

例如:

由于Cookie自NameObjectCollectionBase继承你可以GetAllKeys(),并使用该列表来获取所有的值,并把它们放在一个字典。

例如:

Dictionary cookieCollection = new Dictionary<string, object>(); 

foreach(var key in Request.Cookies.GetAllKeys()) 
{ 
    cookieCollection.Add(key, Request.Cookies.Item[key]); 
} 
5

如果你真的想要一个直List<HttpCookie>无键 - >值连接,那么你可以使用选择在LINQ做到这一点:

var cookies = Request.Cookies.AllKeys.Select(x => Request.Cookies[x]).ToList(); 
+0

如果Cookie是在单独的域中创建的,IE可以发送多个具有相同名称的Cookie。如果发生这种情况,那么上面的代码会丢失其中一个cookie。 – 2012-12-26 15:15:12

0

的问题可能有点老了,但这里的答案是没有覆盖所有的情况下,因为@CM为指出可以有多个具有相同名称的Cookie。

所以最简单的方法是循环Cookies集合有一个循环:

var existingCookies = new List<HttpCookie>(); 

for (var i = 0; i < _httpContext.Request.Cookies.Count; i++) 
{ 
    existingCookies.Add(_httpContext.Request.Cookies[i]); 
} 
相关问题