2010-04-22 12 views
6

Ist es möglich, einen ASP.NET-Cookie-Wert zu aktualisieren, ohne die Ablaufzeit aktualisieren zu müssen? Ich habe festgestellt, dass das Cookie nicht mehr existiert, wenn ich versuche, ein Cookie zu aktualisieren, ohne das Ablaufdatum zu aktualisieren. Ich habe den folgenden Code, den ich ändern möchte. Was ist der Zweck eines Ablaufs, wenn jedes Mal, wenn der Cookie-Wert aktualisiert wird, auch der Ablauf?ASP.NET-Cookie-Aktualisierungswert ohne Aktualisierungsablauf?

 HttpCookie cookie = HttpContext.Current.Request.Cookies[constantCookie]; 

     if (cookie == null) 
      cookie = new HttpCookie(constantCookie); 

     cookie.Expires = DateTime.Now.AddYears(1); 
     cookie.Value = openClose; 
     HttpContext.Current.Response.Cookies.Set(cookie); 
+2

„Was ist der Punkt von einem Ablaufdatum, wenn jedes Mal, wenn der Cookie-Wert aktualisiert wird, auch das Ablaufdatum ist? " - Nun, das ist eigentlich das, was du oft willst. Szenarien wie "Wenn Sie einen Monat lang nicht mehr zu Besuch sind, werden wir vergessen", hängen davon ab, dass jedes Mal, wenn Sie das Cookie besuchen, ein Monat abläuft. –

+0

Sehr wahr, ich würde Ihnen in diesem Punkt definitiv zustimmen. – aherrick

Antwort

5

Die Klasse ASP.NET Http kann die Verfällt Eigenschaft nicht initialisiert wird in einem Cookie von einer HTTP-Anforderung beim Lesen (da die HTTP-Spezifikation nicht den Client benötigt, um auch den Ablaufwert auf den Server in dem schicken erster Platz). Und wenn Sie die Expires-Eigenschaft nicht festlegen, bevor Sie das Cookie in der HTTP-Antwort zurücksetzen, verwandelt es es in ein Sitzungscookie anstelle eines dauerhaften Cookies.

Wenn Sie das Ablaufdatum wirklich beibehalten müssen, können Sie das ursprüngliche Ablaufdatum als Teil des Cookie-Werts festlegen. Wenn Sie das Cookie dann einlesen, analysieren Sie den Wert und legen Sie das neue Ablaufdatum fest.

Ein Beispiel, das keine anderen Daten enthält so das Cookie nicht wirklich hilfreich ist - würden Sie es irgendwie mit dem tatsächlichen Daten serialisiert müssen Sie speichern möchten:

HttpCookie cookie = HttpContext.Current.Request.Cookies[constantCookie]; 
DateTime expires = DateTime.Now.AddYears(1); 

if (cookie == null) { 
    cookie = new HttpCookie(constantCookie); 
} else { 
    // cookie.Value would have to be deserialized if it had real data 
    expires = DateTime.Parse(cookie.Value); 
} 

cookie.Expires = expires; 
// save the original expiration back to the cookie value; if you want to store 
// more than just that piece of data, you would have to serialize this with the 
// actual data to store 
cookie.Value = expires.ToString(); 

HttpContext.Current.Response.Cookies.Set(cookie); 
+2

Gute Antwort, obwohl es nicht nur ASP.NET ist, das das Ablaufdatum nicht initialisiert - ein Cookie-Ablaufdatum ist im Allgemeinen 'schreibgeschützt' und wird nicht auf dem Webserver in http-Anfragen veröffentlicht. – maxp

+0

Für mich obwohl auf der Serverseite der Cookie abläuft Wert zeigt letzten Set-Wert nicht, aber der Browser speichert den richtigen Wert, auch wenn ich nur den Cookie-Wert aktualisieren und nicht abläuft. –

+0

@mrbengi Dieser Beitrag bezieht sich auf Cookies. Sie haben eine neue Frage zur Funktionsweise des DateTime-Parsens gestellt. Es gibt viele Quellen, um Hilfe zu finden, oder stellen Sie eine neue Frage über den Link oben rechts auf der StackOverflow-Seite. Aber Ihr Kommentar gilt nicht für dieses Thema. –