Wann Request.Cookies über Response.Cookies verwenden?


57

Verwenden Sie die Antwort bei einem Seitenereignis (z. B. Laden), da dies eine Antwort von ASP.NET ist, und eine Anfrage beim Drücken einer Schaltfläche, da dies eine Antwort an ASP.NET zur Verarbeitung ist? Oder ist da mehr dran?

39

In einer Webanwendung ist die Anfrage, was kommt aus dem Browser und die Antwort ist, was der Server zurücksendet. Wenn Sie Cookies oder Cookie-Daten vom Browser überprüfen, sollten Sie die Request.Cookies verwenden. Wenn Sie Cookies erstellen, die an den Browser gesendet werden, müssen Sie sie zu Response.Cookies hinzufügen.


95

Sie sind 2 verschiedene Dinge, ein SPART [Antwort], die andere LIEST [Anfrage]

in einem Cookie (Informatik sprechend) :) sie eine Zeit eine kleine Datei speichern von Zeit, die ein Objekt des Typs String

in dem .NET-Framework enthält Sie save a cookie tun:

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."); 

Sie haben einen Cookie geschrieben, der für eine Minute verfügbar sein wird ... normalerweise tun wir now.AddMonth (1), damit Sie einen Cookie für einen ganzen Monat speichern können.

Um retrieve a cookie verwenden Sie die Anfrage (Sie anfordern), wie:

HttpCookie myCookie = new HttpCookie("MyTestCookie"); 
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"); 

Denken Sie daran:

Um ein Plätzchen zu löschen, gibt es keine direkte Code, der Trick ist, zu Speichern Sie den gleichen Cookie-Namen mit einem bereits abgelaufenen Ablaufdatum, z. B. now.AddMinutes (-1)

Dies löscht den Cookie.

Wie Sie sehen, wird diese Datei jedes Mal, wenn die Lebensdauer des Cookies abläuft, automatisch aus dem System gelöscht.

+7

+1 ich nicht erkennen Sie das Cookie erneut zu speichern hatte 29 apr. 102010-04-29 10:48:05

+2

+1 klar und dennoch einfache Erklärung zu aktualisieren Dies war meistens hilfreich, aber ein wenig irreführend, da In deinem Beispiel überschreibst du den Cookie, der zuvor mit der Zeile 'HttpCookie myCookie = new HttpCookie (" MyTestCookie ") gespeichert wurde, mit dem Cookie.' Stattdessen verwende so etwas wie 'HttpCookie myCookie = new HttpCookie (" MyWrittenCookie ") ; ' 27 aug. 132013-08-27 12:49:19

+1

den Ablauf 14 nov. 132013-11-14 20:16:28

+1

Dies unterstützt nicht das Lesen eines Cookies, das gerade in der Antwort gesendet wurde. In diesem Fall müssen Sie' Response.Cookies' verwenden. 13 okt. 152015-10-13 03:27:17

  0

Ich glaube, dass dies wahr ist, wenn Sie Server Side Code programmieren. Für den Client-Code ist es umgekehrt. 30 mär. 172017-03-30 08:59:06


4

Die Cookies stammen aus dem Browser in der Sammlung "Request.Cookies". Dort lesen Sie die Cookies, die gesendet wurden.

Um Cookies an den Browser zurückzusenden, legen Sie sie in die Response.Cookies-Sammlung.

Wenn Sie einen Cookie löschen möchten, müssen Sie den Browser anweisen, ihn zu entfernen, indem Sie den Cookie mit einem abgelaufenen Ablaufdatum senden. Der Browser verwendet die lokale Zeit des Clientcomputers. Wenn Sie also die Serverzeit zum Erstellen eines Datums verwenden, müssen Sie mindestens einen Tag abziehen, um sicherzustellen, dass er tatsächlich in der lokalen Uhrzeit des Clients übergeben wurde.


16

Verwenden Sie beim Schreiben eines Cookies die Antwort, aber das Lesen hängt von Ihrer Situation ab. Normalerweise lesen Sie von Request, aber wenn Ihre Anwendung versucht, einen Cookie zu erhalten, der gerade geschrieben oder aktualisiert wurde und der Roundtrip zum Browser nicht stattgefunden hat, müssen Sie ihn möglicherweise in Response lesen.

Ich habe dieses Muster für eine Weile verwendet und es funktioniert gut für mich.

+4

Ein alternativer, aber gleichwertiger Ansatz wäre es, Ihren Cookie beim Speichern einfach in die Sammlungen Response.Cookies AND Request.Cookies zu schreiben. Auf diese Weise kann jede weitere Logik im Zyklus den Cookie lesen, den Sie gerade gesetzt haben, ohne das Response-Objekt zu betrachten. 23 feb. 092009-02-23 00:59:23

  0

Chris, einverstanden und ich habe das gemacht, aber ich habe vor kurzem gelesen, dass das Ändern des Request-Objekts ein No-No ist. Wird versuchen, eine Referenz zu finden. 23 feb. 092009-02-23 01:11:32

  0

Danke, Chris. Andrew - ich würde gerne diese Referenz sehen. Für jetzt gehe ich mit Chris Lösung. 09 sep. 092009-09-09 19:30:37

  0

Ein nützliches Muster, aber beachten Sie, dass es nicht 100% threadsicher ist. 12 sep. 132013-09-12 20:50:52


2

Wenn ich ein Cookie in .NET erstelle oder aktualisiere, mache ich das normalerweise sowohl bei der Anfrage als auch bei der Antwort-Cookie-Sammlung. Auf diese Weise können Sie sicher sein, dass Sie, wenn Sie versuchen, den Cookie weiter unten in der Seitenanforderungssequenz zu lesen, die richtigen Informationen haben.

  0

Alex, dieses spezielle Problem hat mich den ganzen Tag gestört. Danke, dass du es so einfach gemacht hast! 09 sep. 092009-09-09 19:29:53

  0

Yeh, es gibt einige interessante Verhaltensweisen, bei denen das Setzen eines Cookies in Response es auch im Request einstellt, wenn es noch nicht existiert. Wenn es jedoch bereits in der Anforderung vorhanden war, wird durch die Einstellung Antwort die Anfrage nicht aktualisiert. Es scheint also ein Feature zu sein, das hilfreich sein soll, aber etwas inkonsistent. Wenn Sie einen Cookie mehrfach in derselben Anfrage ändern, können Sie Fehler finden. 09 jul. 142014-07-09 21:31:02


1

Andrew's Code gab einen Fehler in "AllKeys.Contains" -Methode. So korrigierte ich ein wenig ..

public void WriteCookie(string strCookieName, string strCookieValue) 
    { 
     var hcCookie = new HttpCookie(strCookieName, strCookieValue); 
     HttpContext.Current.Response.Cookies.Set(hcCookie); 
    } 


    public string ReadCookie(string strCookieName) 
    {  
     foreach (string strCookie in HttpContext.Current.Response.Cookies.AllKeys) 
     { 
      if (strCookie == strCookieName) 
      { 
       return HttpContext.Current.Response.Cookies[strCookie].Value; 
      } 
     }   

     foreach (string strCookie in HttpContext.Current.Request.Cookies.AllKeys) 
     { 
      if (strCookie == strCookieName) 
      { 
       return HttpContext.Current.Request.Cookies[strCookie].Value; 
      } 
     } 

     return null; 
    } 
  0

Haben Sie daran gedacht, System.Linq einzuschließen? Dadurch wurde der Fehler in meiner Datei behoben. 06 feb. 122012-02-06 16:04:44

  0

Wenn das nur ein kleiner Fehler ist, schlagen Sie besser eine Bearbeitung des ursprünglichen Beitrags vor, bevor Sie die Antwort duplizieren. 06 dez. 122012-12-06 17:11:46