10
votes

Comment convertir la collection de cookies à une liste générique? Facilement

Quelqu'un sache comment je peux convertir demande.cookies dans une liste ? Ce qui suit n'a pas fonctionné car il jette une exception. XXX

Exception: Impossible de lancer Objet de type 'System.string' to tapez 'System.web.httpcookie'


0 commentaires

5 Réponses :


2
votes

.Cookies.Cast (); code> essaie de jeter la collection de clés à une collection de cookies. Il est donc normal que vous obtenez une erreur :)

C'est un nom -> Collection de valeurs, de sorte que la jette dans une liste ne serait pas bonne. P>

J'essaierais de la convertir à un dictionnaire. P>

Par exemple: p>

puisque les cookies hérite de nomObjectCollectionbase, vous pouvez Getallkeys () et utilisez cette liste pour obtenir toutes les valeurs et les mettre dans un dictionnaire. P>

Par exemple: P>

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

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


0 commentaires

13
votes

La raison pour laquelle cela se produit est parce que le NomObjectCollectionBase code> Type que request.cookies code> dérive de recule sur les clés de la collection et non sur les valeurs. Donc, lorsque vous énumérez-vous sur la collection demande.cookies CODE> Vous obtenez les clés: xxx pré>

Cela signifie que les éléments suivants fonctionnent: P>

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


4 commentaires

Mais alors vous perdez la clé -> Connexion de la valeur :)


@Snake, je suis d'accord avec vous que ce n'est pas optimal du point de vue de la performance, car elle énumérera la collection plusieurs fois, mais si vous avez quelques éléments, il pourrait ne pas être dramatique.


L'utilisation du membre AllKeys de httpcookiecollection enregistre une distribution. Voir ma réponse pour le code.


Cela m'a aidé à résoudre un problème avec XMLSérialiseur sérialisant les clés et non les valeurs. My NameObjectCollectionbase Sous-classe Base nécessaire pour remplacer Getenumerator comme renvoyer cela.basegetvalues ​​(). Getenumerator ();



6
votes

Si vous voulez vraiment une liste droite code> sans clé -> Connexion de valeur, vous pouvez utiliser Sélectionner dans Linq pour le faire:

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


2 commentaires

IE peut envoyer plusieurs cookies avec le même nom si les cookies sont créés dans des domaines distincts. Si cela se produit, le code ci-dessus perd l'un des cookies.


Le code obtient uniquement le premier cookie avec le même nom.



2
votes

La question peut être un peu ancienne, mais les réponses ici ne couvrent pas tous les cas, car comme indiqué par @ c.m. Il peut y avoir plusieurs biscuits avec le même nom.

Le moyen le plus simple est de boucler la collection de cookies avec A pour boucle: P>

var existingCookies = new List<HttpCookie>();

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


0 commentaires

0
votes

Vous pouvez éviter d'itération des clés à l'aide de code> de la collection code> avec énumérable.Range code>.

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


0 commentaires