2008-10-16 11 views
14

Mam następujący kod, który ustawia plik cookie:cookie traci wartość w ASP.net

string locale = ((DropDownList)this.LoginUser.FindControl("locale")).SelectedValue; 
    HttpCookie cookie = new HttpCookie("localization",locale); 
    cookie.Expires= DateTime.Now.AddYears(1); 
    Response.Cookies.Set(cookie); 

Jednak gdy próbuję odczytać pliku cookie, wartość jest zerowa. Plik cookie istnieje. Nigdy nie przechodzę obok następujących, jeśli sprawdzić:

  if (Request.Cookies["localization"] != null && !string.IsNullOrEmpty(Request.Cookies["localization"].Value)) 

Pomoc?

+0

Wpisz livehttpheaders aby sprawdzić, czy plik cookie jest zwracane do przeglądarka. http s: //addons.mozilla.org/en-US/firefox/addon/3829 –

+0

Nie zapomnij przyjąć odpowiedzi na pytanie –

Odpowiedz

41

Kontrola jest przeprowadzana po odesłaniu zwrotnym? Jeśli tak, powinieneś przeczytać plik cookie z kolekcji Request.

Pliki cookie są przechowywane w przeglądarce, dodając je do pliku Response.Cookies i są odczytywane z plików Request.Cookies.

Pliki cookie dodane do odpowiedzi można odczytać tylko wtedy, gdy strona jest na tej samej prośbie.

+0

Nie wiesz, dlaczego Response.Cookies usuwa wartości, ale dzięki. Uratowałeś mi dużo czasu. –

0

Czy masz już dość "kolekcji" zamiast kolekcji "Reakcja"?

 
if (Request.Cookies["localization"] != null && !string.IsNullOrEmpty(Request.Cookies["localization"].Value)) 
-1

użyć Response.Cookies.Add (cookie); zamiast Response.Cookies.Set (cookie);

0

Spróbuj fragment -

string locale = ((DropDownList)this.LoginUser.FindControl("locale")) 
                .SelectedValue; 
HttpCookie myCookie = new HttpCookie("localization"); 
Response.Cookies.Add(myCookie); 
myCookie.Values.Add("locale", locale); 
Response.Cookies["localization"].Expires = DateTime.Now.AddYears(1); 

& aby ją przeczytać -

if (Request.Cookies["localization"] != null) 
{ 
    HttpCookie cookie = Request.Cookies["localization"]; 
    string locale = cookie.Values["locale"].ToString(); 
} 
0

jeśli kompilacji w trybie debugowania, włącz śledzenie stron w pytaniu i upewnić się, że plik cookie jest w zbiorze żądań. Ustaw śledzenie w dyrektywie @page w pliku aspx.

0

Miałem podobny problem, nie mogłem odczytać plików cookie na poczcie zwrotnej. Problemem dla mnie było to, że sprawdziłem właściwość Bezpieczne pliku cookie, aby było prawdziwe. Mówi się, że gdy włączona jest właściwość Bezpieczna pliku cookie, powoduje to, że plik cookie jest przesyłany tylko wtedy, gdy połączenie korzysta z warstwy Secure Sockets Layer. Nie jestem jednak pewien, jak udało mi się zobaczyć plik cookie w przeglądarce po raz pierwszy, ale nie w przypadku odświeżenia strony, biorąc pod uwagę, że nie transmitowałem przez SSL. W każdym razie, obracając plik cookie.Reklama na false, rozwiązał problem i przeczytał pliki cookie na poczcie zwrotnej.

Przepraszam, jeśli nie musisz nic robić ze swoim problemem, chciałem to udostępnić, ponieważ poświęciłem trochę czasu na rozwiązanie tego problemu.

17

Najbardziej prawdopodobną odpowiedzią jest widoczne na this post

Przy próbie sprawdzenia istnienia pliku cookie przy użyciu obiektu Response zamiast Reqest, ASP.net automatycznie tworzy plik cookie.

Edit: Jako notatkę, skończyło się na pisanie oprogramowania potrzebnego do sprawdzenia istnienia plików cookie, które ASP.NET sprawia, że ​​koszmar z powodu ich ciasteczka API. Skończyło się na napisaniu procesu konwersji, który pobiera pliki cookie z żądania i tworzy mój obiekt stanu. Na końcu żądania tłumaczę mój obiekt stanu z powrotem na pliki cookie i umieszczam je w odpowiedzi (w razie potrzeby). Zmniejszyło to wysiłki, aby dowiedzieć się, czy pliki cookie są w odpowiedzi, zamiast tego zaktualizować je, unikając tworzenia ciasteczek bezsensownych itp.

+1

Właśnie popełniłem ten drugorzędny błąd, użycie obiektu Response do odczytania ciasteczek wymazało mi ciasteczka! To była pomoc. Dzięki. – kstubs

1

Myślę, że znam odpowiedź.

Po prostu USUŃ atrybut działania w tagu <form>.

sprawiają, że wygląda tak: <form id="form1" runat="server">

zamiast tego: <form id="form1" action="DisplayName.aspx" runat="server">

Następnie należy użyć Response.Redirect("DisplayName.aspx"); w kodzie.

0

Doda to jako komentarz do odpowiedzi Chris Marisic, ale nie mam tego privelage :-(

W nawiązaniu do tego, co Chris powiedział w swoim edycji o usunięcie plików cookie z wnioskiem, aby móc odczytać nowo utworzone wartość ciasteczka na odświeżenie skończyło się robi

Private Sub SetPageSize(ByVal pageSize As Integer) 

    ' Set cookie value to pageSize 
    Dim pageSizeCookie As HttpCookie = New HttpCookie(pageSizeCookieName) 
    With pageSizeCookie 
     .Expires = Now.AddYears(100) 
     .Value = pageSize.ToString 
    End With 

    ' Add to response to save it 
    Me.Response.Cookies.Add(pageSizeCookie) 

    ' Add to request so available for postback 
    Me.Request.Cookies.Remove(pageSizeCookieName) 
    Me.Request.Cookies.Add(pageSizeCookie) 

End Sub 

The Request.Cookies.Remove i Request.Cookies.Add liniach dzięki czemu działa na postbacks

Powiązane problemy