2012-05-31 1 views
2

Je ne joue généralement pas avec les cookies, mais je voulais examiner celui-ci par rapport aux variables de session que j'utilise généralement.Les cookies ne sont pas réglés rapidement

Si je mets un cookie, alors essayez immédiatement de le lire, je ne récupère pas la valeur que je viens de définir. Cependant, si je rafraîchis la page ou ferme le navigateur et l'ouvre de nouveau, le cookie semble être réglé.

Je débogue dans Chrome. Cela fera-t-il une différence?

public const string COOKIE = "CompanyCookie1"; 
private const int TIMEOUT = 10; 

private string Cookie1 { 
    get { 
    HttpCookie cookie = Request.Cookies[COOKIE]; 
    if (cookie != null) { 
     TimeSpan span = (cookie.Expires - DateTime.Now); 
     if (span.Minutes < TIMEOUT) { 
     string value = cookie.Value; 
     if (!String.IsNullOrEmpty(value)) { 
      string[] split = value.Split('='); 
      return split[split.Length - 1]; 
     } 
     return cookie.Value; 
     } 
    } 
    return null; 
    } 
    set { 
    HttpCookie cookie = new HttpCookie(COOKIE); 
    cookie[COOKIE] = value; 
    int minutes = String.IsNullOrEmpty(value) ? -1 : TIMEOUT; 
    cookie.Expires = DateTime.Now.AddMinutes(minutes); 
    Response.Cookies.Add(cookie); 
    } 
} 

Voici comment je l'utilise:

public Employee ActiveEmployee { 
    get { 
    string num = Request.QueryString["num"]; 
    string empNum = String.IsNullOrEmpty(num) ? Cookie1 : num; 
    return GetActiveEmployee(empNum); 
    } 
    set { 
    Cookie1 = (value != null) ? value.Badge : null; 
    } 
} 

Voici comment je l'appelle, où Request.QueryString["num"] retours NULL afin que Cookie1 est en cours de lecture:

ActiveEmployee = new Employee() { Badge = "000000" }; 
Console.WriteLine(ActiveEmployee.Badge); // ActiveEmployee is NULL 

... mais la lecture de Cookie1 renvoie null également.

Existe-t-il une commande comme Commit() que j'ai besoin d'appeler pour qu'une valeur de cookie soit immédiatement disponible?

Répondre

2

Pour ajouter aux autres réponses, vous pouvez contourner le problème en mettant en cache la valeur dans une variable privée dans le cas où le cookie n'a pas été mis à jour encore:

private string _cookie1Value = null; 
private string Cookie1 { 
    get { 
    if (_cookie1Value == null) 
    { 
     // insert current code 
     _cookie1Value = cookie.Value; 
    } 
    return _cookie1Value; 
    } 
    set { 
    // insert current code 
    _cookie1Value = value; 
    } 
} 
+0

+1, devrait être 'else { // insérer le code actuel _cookie1Value = cookie.Value; return _cookie1Value; } –

+0

Aussi, probablement vouloir définir le cookie dans Response.Cookies dans le setter. –

+1

@ChrisShain: Merci, j'ai réarrangé et simplifié le getter. En ce qui concerne votre deuxième commentaire, c'est ce que '// insérer le code actuel' est pour dans le setter. – mellamokb

5

Lorsque vous définissez un cookie dans une réponse il ne se transporte par magie pas dans la demande collection cookies. Il est là dans la réponse, vous êtes libre de le vérifier, mais il n'apparaîtra pas dans l'objet de requête jusqu'à ce qu'il soit réellement envoyé par le navigateur lors de la prochaine requête.

6

Les cookies ne ressemblent pas à la Session: il existe deux collections de cookies, pas une.

Request.Cookies != Response.Cookies. Le premier est l'ensemble des cookies qui sont envoyés à partir du navigateur quand ils demandent la page, ce dernier est ce que vous renvoyez avec le contenu. Cela expose la nature des cookies RFC, contrairement à Session, qui est une construction purement Microsoft.

+0

Vous êtes fou! Donc, devrais/puis-je écrire ce cookie dans la collection 'Request.Cookies'? (FYI: J'ai essayé cela, mais il n'a toujours pas montré ma valeur jusqu'à ce que j'ai rafraîchi la page) – jp2code

+0

Vous ne devriez pas essayer de l'écrire à la demande.Cookies - c'est pour lire la valeur qui a été envoyée par le navigateur. Lire à partir de la demande, écrire à la réponse. –

1

Pour mettre simplement; Un cookie défini en réponse ne sera disponible que pour la prochaine requête htpp (une action get ou post du navigateur). En détail: Lorsqu'une valeur de cookie est définie dans HttpResponse, elle ne sera conservée/stockée que lorsque la réponse atteindra le client (ce qui signifie que le navigateur lira la valeur de cookie de l'en-tête Http Response et l'enregistrera). Donc, techniquement seulement pour les demandes désormais, il sera disponible. Exemple, lorsque l'utilisateur clique sur un lien ou sur un bouton qui appelle le serveur après ce cycle depuis le navigateur. J'espère que cela vous donne une idée, je vous suggère de lire le Qu'est-ce que les cookies et ASP.NET l'enveloppe avant de l'utiliser.

Questions connexes