Kiedy używać Request.Cookies przez Response.Cookies?


57

Czy używam odpowiedzi podczas zdarzenia strony (np. Obciążenia), ponieważ jest to odpowiedź z programu ASP.NET i żądanie po naciśnięciu przycisku, ponieważ jest to odpowiedź na przejście do ASP.NET w celu przetworzenia? Czy może jest coś więcej?

39

W aplikacji internetowej żądanie pochodzi z przeglądarki, a odpowiedź jest tym, co serwer odsyła. Podczas sprawdzania poprawności plików cookie lub plików cookie z przeglądarki, należy użyć Request.Cookies. Kiedy tworzysz pliki cookie do wysłania do przeglądarki, musisz dodać je do Response.Cookies.


95

Są to 2 różne rzeczy, jedna oszczędza [odpowiedzi], drugi CZYTA [Request]

w pliku cookie (informatyki mówiąc) :) zapisać mały plik do okresie czas który zawiera obiekt typu strun

w ramach .NET ty save a cookie robi:

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

Napisałeś plik cookie, który będzie dostępny przez minutę ... zazwyczaj robimy teraz .AddMonth (1), dzięki czemu możesz zapisać plik cookie przez cały miesiąc.

Aby retrieve a cookie, należy użyć życzenie (żądasz), takich jak:

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

Pamiętaj:

Aby usunąć ciasteczka, nie ma bezpośredniego kod, sztuką jest Zapisz tę samą nazwę pliku cookie z datą ważności, która już minęła, na przykład .AddMinuty (-1)

spowoduje to usunięcie pliku cookie.

Jak widać, za każdym razem, gdy wygasa czas życia pliku cookie, plik ten jest automatycznie usuwany z systemu.

+7

+1 Nie zdawałem sobie sprawy trzeba było ponownie zapisać plik cookie, aby zaktualizować upływem 29 kwi. 102010-04-29 10:48:05

+2

+1 jeszcze jasne proste wyjaśnienie 27 sie. 132013-08-27 12:49:19

+1

Było to możliwe głównie pomocny, ale nieco mylące, ponieważ w twoim przykładzie, kiedy przejdziesz do pobrania pliku cookie, faktycznie nadpisujesz plik cookie, który był wcześniej zapisany w linii 'HttpCookie myCookie = new HttpCookie (" MyTestCookie ");' Zamiast tego użyj czegoś takiego jak 'HttpCookie myCookie = new HttpCookie (" MyWrittenCookie ") ; ' 14 lis. 132013-11-14 20:16:28

+1

To nie obsługuje odczytu cookie, który właśnie został wysłany w odpowiedzi, w takim przypadku musisz użyć' Response.Cookies' 13 paź. 152015-10-13 03:27:17

  0

Wierzę, że to prawda, gdy programujesz kod po stronie serwera. dla kodu klienta jest odwrotnie. 30 mar. 172017-03-30 08:59:06


4

Pliki cookie pochodzą z przeglądarki w kolekcji Request.Cookies. Tam czytasz wysłane ciasteczka.

Aby wysłać pliki cookie z powrotem do przeglądarki, umieść je w kolekcji Response.Cookies.

Jeśli chcesz usunąć plik cookie, musisz powiadomić przeglądarkę, aby go usunąć, wysyłając plik cookie z datą ważności, która minęła. Przeglądarka używa czasu lokalnego komputera klienckiego, więc jeśli używasz czasu serwera do utworzenia daty, pamiętaj, aby odjąć co najmniej jeden dzień, aby upewnić się, że faktycznie upłynął czas lokalny klienta.


16

Podczas pisania pliku cookie użyj opcji Odpowiedź, ale czytanie może zależeć od Twojej sytuacji. Zwykle czytasz z Żądania, ale jeśli twoja aplikacja próbuje uzyskać plik cookie, który został właśnie napisany lub zaktualizowany, a podróż w obie strony do przeglądarki nie nastąpiła, być może będziesz musiał przeczytać ją z formularza Odpowiedź.

Używam tego wzoru przez pewien czas i działa dobrze dla mnie.

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

Alternatywnym, ale jednakowym podejściem byłoby po prostu zapisanie pliku cookie do kolekcji Response.Cookies AND Request.Cookies podczas zapisywania. W ten sposób każda kolejna logika w cyklu może odczytać plik cookie, który właśnie ustawiłeś, nie zaglądając do obiektu Response. 23 lut. 092009-02-23 00:59:23

  0

Chris, zgodził się i ja to robiłem, ale ostatnio przeczytałem, że modyfikowanie obiektu Request jest nie-nie. Spróbuję znaleźć odniesienie. 23 lut. 092009-02-23 01:11:32

  0

Dzięki, Chris. Andrew - chciałbym zobaczyć to odniesienie. Na razie idę z rozwiązaniem Chrisa. 09 wrz. 092009-09-09 19:30:37

  0

Przydatny wzór, ale pamiętaj, że nie jest w 100% bezpieczny dla wątków. 12 wrz. 132013-09-12 20:50:52


2

Kiedy tworzę lub aktualizuję plik cookie w .NET i zwykle robię to zarówno w zbiorze plików cookie żądania i odpowiedzi. W ten sposób możesz być pewien, że jeśli spróbujesz odczytać plik cookie w dalszej kolejności, uzyskasz poprawne informacje.

  0

Alex, ten szczególny problem dokuczał mi przez cały dzień. Dzięki za to, że to wyczyścisz! 09 wrz. 092009-09-09 19:29:53

  0

Tak, istnieje kilka interesujących zachowań, w których ustawienie pliku cookie w odpowiedzi spowoduje również ustawienie go w Żądaniu, jeśli jeszcze nie istniało. Ale jeśli już istniało w Żądaniu, ustawienie Odpowiedź NIE aktualizuje Żądania. Wygląda więc na to, że funkcja ma być pomocna, ale nieco niespójna. Z pewnością podczas modyfikowania wielu plików cookie w tym samym żądaniu można uruchomić błędy. 09 lip. 142014-07-09 21:31:02


1

Kod Andrzeja zgłosił błąd w metodzie "AllKeys.Contains". Więc poprawiłem trochę ..

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

Czy pamiętasz o włączeniu System.Linq? Spowoduje to naprawienie błędu w moim pliku. 06 lut. 122012-02-06 16:04:44

  0

Jeśli jest to tylko mały błąd, lepiej zaproponować zmianę oryginalnego wpisu przed skopiowaniem odpowiedzi. 06 gru. 122012-12-06 17:11:46