Quelqu'un sache comment je peux convertir Exception: Impossible de lancer Objet de type 'System.string' to tapez 'System.web.httpcookie' em> p> p> demande.cookies code> dans une liste
5 Réponses :
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> .Cookies.Cast
Dictionary cookieCollection = new Dictionary<string, object>();
foreach(var key in Request.Cookies.GetAllKeys())
{
cookieCollection.Add(key, Request.Cookies.Item[key]);
}
La raison pour laquelle cela se produit est parce que le Cela signifie que les éléments suivants fonctionnent: P> 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
List<HttpCookie> lstCookies = Request.Cookies.AllKeys
.Select(x => Request.Cookies[x]).ToList();
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 (); code>
Si vous voulez vraiment une liste droite
var cookies = Request.Cookies.AllKeys.Select(x => Request.Cookies[x]).ToList();
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.
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]); }
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));
}
}