61 votes

Quand utiliser les cookies de demande plutôt que les cookies de réponse ?

Dois-je utiliser response lors d'un événement de page (par exemple, le chargement), car il s'agit d'une réponse de ASP.NET, et request lorsque je presse un bouton, car il s'agit d'une réponse envoyée à ASP.NET pour traitement ? Ou y a-t-il autre chose à faire ?

102voto

balexandre Points 36115

Ce sont deux choses différentes, une ECONOMIE [Réponse], l'autre LECTURES [Demande]

dans un Cookie (informatiquement parlant) :) vous enregistrez un petit fichier pour un période de temps qui contient un objet de type chaîne de caractères

dans le cadre de .NET, vous sauvegarder un cookie faire :

HttpCookie myCookie = new HttpCookie("MyTestCookie");
DateTime now = DateTime.Now;

// Set the cookie value.
myCookie.Value = now.ToString();
// Set the cookie expiration date.
myCookie.Expires = now.AddMinutes(1);

// Add the cookie.
Response.Cookies.Add(myCookie);

Response.Write("<p> The cookie has been written.");

Vous avez écrit un cookie qui sera disponible pendant une minute... normalement nous faisons now.AddMonth(1) pour que tu puisses garder un cookie pendant un mois entier.

A récupérer un cookie vous utilisez la demande (vous faites une demande), comme :

HttpCookie myCookie = Request.Cookies["MyTestCookie"];

// Read the cookie information and display it.
if (myCookie != null)
   Response.Write("<p>"+ myCookie.Name + "<p>"+ myCookie.Value);
else
   Response.Write("not found");

Rappelez-vous :

Pour supprimer un cookie, il n'y a pas de code direct, l'astuce consiste à Sauvez le même nom de cookie avec une date d'expiration déjà dépassée, par exemple, now.AddMinutes(-1)

cela supprimera le cookie.

Comme vous pouvez le constater, chaque fois que la durée de vie du cookie expire, ce fichier est automatiquement supprimé du système.

7 votes

+1 Je n'avais pas réalisé que vous deviez réenregistrer le cookie pour mettre à jour l'expiration.

1 votes

Cela s'est avéré utile, mais un peu trompeur puisque dans votre exemple, lorsque vous récupérez le cookie, vous écrasez en fait le cookie précédemment enregistré avec la ligne HttpCookie myCookie = new HttpCookie("MyTestCookie"); Utilisez plutôt quelque chose comme HttpCookie myCookie = new HttpCookie("MyWrittenCookie");

2 votes

Cela ne permet pas de lire un cookie qui vient d'être envoyé dans la réponse, auquel cas vous devez utiliser l'option Response.Cookies

41voto

tvanfosson Points 268301

Dans une application web, la demande est ce qui vient du navigateur et la réponse est ce que le serveur renvoie. Lorsque vous validez des cookies ou des données de cookies provenant du navigateur, vous devez utiliser Request.Cookies. Lorsque vous construisez des cookies à envoyer au navigateur, vous devez les ajouter à Response.Cookies.

0 votes

Pour une clarification, serveur signifie ici que l'application traite et répond à la demande du navigateur.

19voto

andleer Points 12090

Lorsque vous écrivez un cookie, utilisez Response mais la lecture peut dépendre de votre situation. Normalement, vous lisez à partir de Request mais si votre application tente d'obtenir un cookie qui vient d'être écrit ou mis à jour et que l'aller-retour avec le navigateur n'a pas eu lieu, vous devrez peut-être le lire à partir de Response.

J'utilise ce modèle depuis un certain temps et il me convient parfaitement.

public void WriteCookie(string name, string value)
{
    var cookie = new HttpCookie(name, value);
    HttpContext.Current.Response.Cookies.Set(cookie);
}

public string ReadCookie(string name)
{
    if (HttpContext.Current.Response.Cookies.AllKeys.Contains(name))
    {
        var cookie = HttpContext.Current.Response.Cookies[name];
        return cookie.Value;
    }

    if (HttpContext.Current.Request.Cookies.AllKeys.Contains(name))
    {
        var cookie = HttpContext.Current.Request.Cookies[name];
        return cookie.Value;
    }

    return null;
}

4 votes

Une approche alternative mais équivalente consisterait à écrire simplement votre cookie dans les collections Response.Cookies ET Request.Cookies lors de la sauvegarde. De cette façon, toute autre logique du cycle peut lire le cookie que vous venez de définir sans avoir à chercher dans l'objet Response.

1 votes

Chris, je suis d'accord et j'avais l'habitude de le faire, mais j'ai lu récemment que la modification de l'objet Request est à proscrire. Je vais essayer de trouver une référence.

0 votes

Merci, Chris. Andrew - J'aimerais bien voir cette référence. Pour l'instant, je vais suivre la solution de Chris.

4voto

Guffa Points 308133

Les cookies proviennent du navigateur dans la collection Request.Cookies. C'est là que vous lisez les cookies qui ont été envoyés.

Pour renvoyer les cookies au navigateur, vous les placez dans la collection Response.Cookies.

Si vous voulez supprimer un cookie, vous devez demander au navigateur de le supprimer en envoyant le cookie avec une date d'expiration dépassée. Le navigateur utilise l'heure locale de l'ordinateur du client. Par conséquent, si vous utilisez l'heure du serveur pour créer une date, veillez à soustraire au moins un jour pour vous assurer que la date est effectivement passée dans l'heure locale du client.

3voto

Alex Points 6968

Lorsque je crée ou mets à jour un cookie dans .NET, je le fais normalement dans la collection de cookies de la demande et de la réponse. De cette façon, vous pouvez être sûr que si vous essayez de lire le cookie plus loin dans la séquence de demande de la page, il aura les informations correctes.

0 votes

Alex, ce problème particulier m'a tracassé toute la journée. Merci de l'avoir résolu si simplement !

0 votes

Oui, il existe des comportements intéressants où le fait de définir un cookie dans la réponse le définira également dans la demande s'il n'existait pas déjà. Mais s'il existait déjà dans la requête, le réglage de Response ne met PAS à jour Request. Il s'agit donc d'une fonctionnalité censée être utile, mais quelque peu incohérente. Il est certain que si vous modifiez un cookie plusieurs fois dans la même requête, vous pouvez rencontrer des problèmes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X