有人知道我如何将Request.Cookies
转换为List<HttpCookie>
吗?下面的代码没有起作用,因为它会抛出异常。
List<HttpCookie> lstCookies = new List<HttpCookie>(
Request.Cookies.Cast<HttpCookie>());
异常:无法将类型为“System.String”的对象转换为类型“System.Web.HttpCookie”
Request.Cookies
继承自NameObjectCollectionBase
类型,该类型枚举集合时枚举的是键而不是值。所以当您枚举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();
更新:
正如在评论区和他的答案中@Jon Benedicto指出的那样,使用AllKeys
属性更加优化,因为它避免了强制转换:
List<HttpCookie> lstCookies = Request.Cookies.AllKeys
.Select(x => Request.Cookies[x]).ToList();
List<HttpCookie>
,那么你可以使用LINQ中的Select来实现:var cookies = Request.Cookies.AllKeys.Select(x => Request.Cookies[x]).ToList();
这个问题可能有点老,但是这里的答案并没有涵盖所有情况,因为正如@C.M.指出的那样,可能存在多个同名的cookie。
所以最简单的方法是使用for循环遍历cookies集合:
var existingCookies = new List<HttpCookie>();
for (var i = 0; i < _httpContext.Request.Cookies.Count; i++)
{
existingCookies.Add(_httpContext.Request.Cookies[i]);
}
.Cookies.Cast<HttpCookie>();
尝试将键的集合转换为cookie的集合。所以你得到一个错误是正常的 :)
它是一个名称-值的集合,所以转换为列表不是很好。
我建议尝试将其转换为字典。
例如:
由于Cookies继承自NameObjectCollectionBase,因此您可以GetAllKeys(),并使用该列表获取所有值并将其放入字典中。
例如:
Dictionary cookieCollection = new Dictionary<string, object>();
foreach(var key in Request.Cookies.GetAllKeys())
{
cookieCollection.Add(key, Request.Cookies.Item[key]);
}
您可以通过使用集合的 Count
和 Enumerable.Range
来避免迭代键。
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Foo
{
public static class WebHttpExtensions
{
public static IEnumerable<HttpCookie> AsEnumerable(this HttpCookieCollection webCookies) =>
Enumerable
.Range(0, webCookies.Count)
.Select(ndx => webCookies[ndx]);
public static IEnumerable<System.Net.Cookie> ToNetCookies(this HttpCookieCollection webCookies) =>
webCookies
.AsEnumerable()
.Select(x => new System.Net.Cookie(x.Name, x.Value));
}
}
return this.BaseGetValues().GetEnumerator();
- B2K